【问题标题】:How can I use a C# (managed) dll that I don't have?如何使用我没有的 C#(托管)dll?
【发布时间】:2011-06-25 00:21:45
【问题描述】:

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

背景:

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

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

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

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

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

谢谢

【问题讨论】:

  • 托管 (.NET) 或非托管 dll?
  • 托管。 (已更新。谢谢。)
  • 在托管情况下,从正确的位置也将是一个问题,因为从 C:\SmpleProgram 不会从 C:\FancyProgram 加载任何 dll。或者依赖项是 GAC 版的?从来没有尝试过符号链接是否可以解决问题(是的:weblogs.asp.net/israelio/archive/2011/01/10/…
  • 我不知道 FancyProgram 如何管理它自己的 DLL 加载。
  • 如果您需要调用其中一个 dll 文件,那么您将不得不引用它,我假设这个简单程序也是 C#,没有办法解决这个问题。您需要从 Fancy Program 中获取所需的 dll,您所要做的就是复制和粘贴。如果有问题的 dll 以正确的方式编写,它将不依赖于其他任何内容,如果没有正确编写,您显然在这件事上别无选择。你的问题真的没有意义,你怎么能期望使用一个你不能与将使用该 dll 文件的程序捆绑的 dll?

标签: c# visual-studio dll dllimport


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    .Net 无论如何都会进行后期绑定。只要您在真正打算加载它之前不以任何方式引用 .dll,这将起作用。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      我还将构建用于本地测试的 dll,与您的外部 dll 具有相同的接口。您在其中添加了多少功能取决于界面的复杂性和您的SimpleProgram

      我的旧question 有一些关于导入外部 dll 的出色答案。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 测试将在目标机器上完成。 (这只是代码的一小部分)。 DLL 将位于所有目标计算机上的确切指定位置。如何告诉我的程序在运行时从特定位置加载它?
        • 知道这一点,我会接受 zihotki 的建议。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多