DLL 的入口点

Posted

技术标签:

【中文标题】DLL 的入口点【英文标题】:Entry Point of a DLL 【发布时间】:2011-09-30 08:55:34 【问题描述】:

我有一个c# .netWPF 应用程序,现在我需要注册一些已被BLLDAL 层使用的东西(基本上是NInject IoC 模式的内核)。

我想知道dll 的入口点或类似的东西,我可以在其中放置代码(内核注册)。

对于WPF 部分,我使用App.xaml.cs,对于WCF 部分,我使用Global.asax.cs,因为它们是这些东西的入口点。但是独立的dlls呢,他们的切入点是什么。

一种方法是,我可以在我的 dll 中添加一个静态类来实现这个目的,并从app.xaml.cs 我调用 BLL 的这个方法并注册我的内核。但这似乎更像是一种解决方法而不是方法。

请指导我更多的点和逻辑。

【问题讨论】:

【参考方案1】:

容器配置是在应用程序的复合根目录中完成的(代码第一次被调用的地方)。正如您已经说过的,对于 WPF,这是 App.xaml.cs。在这里注册所有层的组件。最好您必须在 App.xaml 之外的另一个程序集中编写 UI 代码。这样一来,spplication 的创建就与代码的执行完全分离了。

我建议阅读 Mark Seeman 的书中对此进行了详细描述。

【讨论】:

感谢您的回复,但我的 UI 层或 app.xaml.cs 不包含 BLL 层的引用,UI 和 BLL 层之间还有一些其他层,我想不花钱直接在我的 UI 层中添加 BLL 层的引用。即使这仍然不是可行的方法,如果没有什么特别的,我会去买这本书,但请告诉我它的名字。 你误会了我的回答。包含 app.xaml 的引导程序集只做一件事。它设置您的应用程序。 UI 层进入另一个程序集。在这种情况下,引用所有层绝对没有问题。如果你想重用一些层并在另一个应用程序中替换其他层,你只需替换这个引导程序。【参考方案2】:

C# 不允许在程序集加载时运行代码,静态类构造函数在首次访问该类时延迟执行。然而,CLR 支持静态“程序集构造函数”,可以说,它在第一次加载程序集时执行。请注意,引用仍然会延迟加载,除非您输入特殊属性来标记要急切加载的引用程序集。

如果您愿意,可以通过 ildasm/ilasm 将静态构造函数放入程序集模块。您可能可以编写一些脚本来在构建时自动执行此操作。

我自己还没有这样做,所以我不能举任何例子。不过,如果您考虑这样做,我也许可以挖掘一些链接。

【讨论】:

+1 为了增加可搜索性,经常使用术语模块初始化器【参考方案3】:

听起来您几乎想要一个“插件”模型,应用程序可以在其中动态发现可用的组件。如果是这样,那么MEF 可能是更好的选择。

MEF 似乎适用于应用程序可能无法提前知道所有依赖项的情况。另一方面,依赖注入假定您的应用提前相当了解这些依赖关系。

我不知道这是否是你所追求的,但它可能值得一看。

【讨论】:

以上是关于DLL 的入口点的主要内容,如果未能解决你的问题,请参考以下文章

找不到 DLL 入口点

无法在 DLL 中找到入口点

VST2 接口 dll 入口点

为啥不从入口点函数调用 FreeLibrary?

System.EntryNotFoundException:无法在 DLL 中找到入口点

模块qtcore.dll已经加载,但找不到入口点怎么解决