我怎样才能使用我没有的C#(托管)DLL?

时间:2011-02-10 16:57:40

标签: c# visual-studio dll dllimport

如何正确引用我没有物理访问权限的C#DLL? (我实际上有DLL,只是不是它的所有依赖项。)

背景:

在目标计算机上,C:\FancyProgram中安装了一个程序和许多相互依赖的dll文件。

我需要编写一个将在目标计算机上部署到C:\SimpleProgram的简单应用程序。

这个简单的程序需要调用C:\FancyProgram下的一个dll文件。它是一个.net托管DLL

在我的开发机器上,我FancyProgram的副本。我确实有一个DLL文件,但我没有任何依赖。我也无法将该DLL捆绑到SimpleProgram

在我的Visual Studio项目中使用和引用此DLL的正确方法是什么,以便我的SimpleProgram能够正确编译,但是在运行时从正确的位置加载DLL?

谢谢

4 个答案:

答案 0 :(得分:8)

我的建议是为要从该dll使用的功能创建Facade。并且不要直接使用(引用)它 - 动态地解析和加载它:
C# - Correct Way to Load Assembly, Find Class and Call Run() Method
Load Assembly at runtime and create class instance

答案 1 :(得分:3)

.Net无论如何都会进行后期绑定。只要您不以任何方式引用.dll,直到您实际意味着加载它,这将起作用。

只需将所有引用(字段,属性,方法,实例)封装到特定类或项目中,并仅在必要时创建实例。然后,您可以尝试捕获加载错误。 运行应用程序时,请参阅Visual Studio输出窗口,它将告诉您何时尝试加载.dll。

您可能还希望查看这些事件,以使您的应用正常处理错误:

AppDomain.CurrentDomain.AssemblyLoad += ...;
AppDomain.CurrentDomain.AssemblyResolve += ...;
AppDomain.CurrentDomain.UnhandledException += ...;
AppDomain.CurrentDomain.FirstChanceException += ...;

您可能还想采用MEF方法。它是一个进行后期加载/绑定的框架。

答案 2 :(得分:1)

您可能希望查看LoadLibraryGetProcAddressMarshal.GetDelegateForFunctionPointer的详细信息。

我还会在本地进行测试,使用与外部dll相同的接口。你输入多少功能取决于界面和SimpleProgram的复杂程度。

我的旧版question有一些关于导入外部dll的优秀答案。

答案 3 :(得分:0)

呃,你打算怎么做测试呢?假设你已经想到了这一点,你需要确保.dll在GAC中并以这种方式引用它(理想情况下) .dll需要在所有计算机上的相同位置。在引用中添加.dll并将其标记为Copy Local:false,因此不要部署它。祝你好运。