如何正确引用我没有物理访问权限的C#DLL? (我实际上有DLL,只是不是它的所有依赖项。)
背景:
在目标计算机上,C:\FancyProgram
中安装了一个程序和许多相互依赖的dll文件。
我需要编写一个将在目标计算机上部署到C:\SimpleProgram
的简单应用程序。
这个简单的程序需要调用C:\FancyProgram
下的一个dll文件。它是一个.net托管DLL
在我的开发机器上,我不有FancyProgram
的副本。我确实有一个DLL文件,但我没有任何依赖。我也无法将该DLL捆绑到SimpleProgram
。
在我的Visual Studio项目中使用和引用此DLL的正确方法是什么,以便我的SimpleProgram
能够正确编译,但是在运行时从正确的位置加载DLL?
谢谢
答案 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)
您可能希望查看LoadLibrary
,GetProcAddress
和Marshal.GetDelegateForFunctionPointer
的详细信息。
我还会在本地进行测试,使用与外部dll相同的接口。你输入多少功能取决于界面和SimpleProgram
的复杂程度。
我的旧版question有一些关于导入外部dll的优秀答案。
答案 3 :(得分:0)