如何使用我没有的C#(托管)dll';你没有吗?

如何使用我没有的C#(托管)dll';你没有吗?,c#,visual-studio,dll,dllimport,C#,Visual Studio,Dll,Dllimport,如何正确引用我没有物理访问权限的C#DLL?(我实际上有DLL,只是不是所有的依赖项。) 背景: 在目标计算机上,有一个程序和许多相互依赖的dll文件安装在C:\FancyProgram中 我需要编写一个简单的应用程序,它将部署在目标计算机上C:\SimpleProgram 这个简单的程序需要调用C:\FancyProgram下的一个dll文件。它是一个.net管理的DLL 在我的开发机器上,我没有FancyProgram的副本。我有一个DLL文件,但我没有它的许多依赖项。我也无法将该DLL捆绑

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

背景:

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

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

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

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

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


谢谢你

嗯,你打算如何测试它?假设您已经了解了这一点,那么您需要确保.dll位于GAC中并以这种方式引用它(理想情况下),或者.dll需要位于所有计算机上的相同位置。在引用中添加.dll并将其标记为Copy Local:false,这样就不会部署它。祝你好运。

我的建议是从该dll中为你想要使用的功能创建一个Facades。不要直接使用(引用)它-动态解析并加载它:


您可能需要查看
LoadLibrary
GetProcAddress
Marshall.GetDelegateForFunctionPointer
的详细信息

我还将构建用于本地测试的dll,使用与外部dll相同的接口。你在那里投入了多少功能取决于界面的复杂性和你的
SimpleProgram


对于我以前关于导入外部DLL的问题,有一些很好的答案。

.Net无论如何都会进行后期绑定。只要你不以任何方式引用.dll,直到你真的想加载它,它就会工作

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

您可能还希望查看这些事件,使您的应用程序能够优雅地处理错误:

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

你也可以采取这种方法。它是一个用于执行后期加载/绑定的框架。

Managed(.NET)或unmanaged dll?Managed。(已更新。谢谢。)在托管案例中,从正确的位置加载dll也是一个问题,因为从C:\SmpleProgram不会从C:\FancyProgram加载dll。或者这些依赖关系是GAC吗?从未尝试过符号链接是否可以实现此功能(是的:)我不知道FancyProgramm如何管理自己的DLL加载。如果需要调用其中一个DLL文件,则必须引用它,我假设这个简单的程序也是C#,没有办法解决此问题。您需要从高级程序中获得所需的dll,您所要做的就是复制和粘贴。如果所讨论的dll是以正确的方式编写的,那么它将不依赖于任何其他内容,如果它没有正确编写,那么显然在这件事上您没有选择。你的问题真的没有意义,你怎么能期望使用一个dll,你不能捆绑的程序将使用一个dll文件?测试将在目标机器上完成。(这只是代码的一小部分)。DLL将位于所有目标计算机上的确切指定位置。我如何告诉我的程序在运行时从一个特定的位置加载它?知道了这一点,我同意zihotki的建议。