【问题标题】:How do I incorporate a DLL that will not always be present? [closed]如何合并一个并不总是存在的 DLL? [关闭]
【发布时间】:2016-03-24 15:28:37
【问题描述】:

我需要在我们的大型 C# 软件包中创建一些功能,这些功能将使用来自第三方软件包的 .NET DLL。并非我们所有的客户都会使用这个包。如果我在 Visual Studio 中添加对这些 DLL 的引用,我可以从它们访问我需要的对象,但我认为这会破坏我公司中没有安装此第三方包的其他开发人员的构建。

对于不使用该软件包的客户和开发人员来说,在不破坏任何东西的情况下,我能够访问此第三方功能的正确方法是什么?我是否需要通过创建自己的 DLL 作为间接层来解决这个问题?是否需要在运行时动态加载第三方 DLL?

【问题讨论】:

  • 您使用什么技术?应用程序是 .NET 应用程序,而有问题的 DLL 是 .NET DLL 还是本机 Windows DLL?
  • 我们的是 .NET,我相信有问题的 DLL 也是 .NET。我可以将它作为参考添加到一个简单的应用程序中,并从 C# 调用它。
  • 你已经知道答案了,很难猜出你还需要什么。 “c# 插件框架”查询已经有很多谷歌点击,你不需要更多了。
  • @HansPassant,这太无礼了。不,我还不知道答案,否则我不会问它。我也不知道谷歌的“C# 插件框架”。

标签: c# .net visual-studio dll


【解决方案1】:

据我了解,.NET DLL 在实际需要之前不会由应用程序加载。这意味着如果引用了 DLL,但没有到达使用它的代码分支,则它不需要存在。在这种情况下,也许没有必要实现某些东西。

话虽如此,可以使用一种称为“热加载”的技术,这意味着使用反射来显式访问 .NET DLL 中包含的类型。该技术在this question 中进行了讨论。

【讨论】:

  • 其他开发人员是否需要 DLL 才能构建我们的应用程序?
  • @skiphoppy 这么想,除非它是热加载的。
【解决方案2】:

首先,检查是否已经加载;如果不存在,请检查 .DLL 是否存在,如果存在,则使用 System.Reflection.Assembly.LoadFile 动态加载它。您要检查它是否已经加载的原因是因为动态加载器通常会通过加载额外的实例来浪费内存。

这需要做更多的工作,但通过动态处理,您可以在应用程序中启用/禁用需要根据它是否存在的程序集的功能,这将最大限度地减少人们在尝试使用它时的不必要错误报告它不存在。

在引用不存在的程序集时要小心;尽管 .NET 通常只会在需要程序集时才动态加载,但较新的版本在加载方式上变得更加激进,以防止启动延迟,因此即使它现在可以工作(这取决于整体配置),它也可能无法工作在不久的将来。

【讨论】:

    【解决方案3】:

    看起来我将按照enter link description here 的描述使用动态加载。向 Alberto 展示如何在他的答案中使用动态关键字的道具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多