在C#中引用由另一个应用程序提供的外部.NET DLL

5
我有一个C#项目,引用了一个DLL(称其为外部DLL),该DLL随另一个应用程序一起提供。在构建我的项目时,由于引用,外部DLL会自动添加到我的项目输出中。当我运行我的项目时,它从我的项目文件夹加载外部DLL。
外部DLL所属的其他应用程序由另一个团队开发,并且DLL定期更新。我不想将他们的DLL与我的项目捆绑在一起。相反,我希望在执行时我的项目加载他们的DLL - 而不是从我的项目文件夹中获取DLL副本。
现在我知道可以通过反射实现这一点。我知道可以进行“Assembly.Load”并选择DLL。但由于我在整个代码中使用来自外部DLL的类型,因此我希望代码能够进行静态类型检查。
以下是我的要求:
  1. 能够通过引用外部DLL编译我的项目,并获得静态类型检查。
  2. 运行项目时,从其他应用程序的文件夹中选取外部DLL,而不是从我的项目输出文件夹中获取DLL副本。
是否有解决此问题的方法?是否存在在添加引用和使用反射之间的折中方案?

“发布者策略文件”可能有效。另一个团队是否一直更改其程序集版本? - agent-j
1个回答

5
你的问题最直接的解决方法是更改引用的属性。有一个名为 "Copy Local" 的设置。将其设置为 false,就可以停止将 DLL 复制到项目输出中。你可以通过展开解决方案中的引用文件夹、右键单击相关引用并选择属性来访问引用的属性面板。
在构建时,Visual Studio 将 DLL 复制到项目的输出文件夹中并不会对 .Net Framework 在运行时产生影响。重要的是你所引用的程序集在框架搜索路径中或全局程序集缓存中可用。

那么,禁用“Copy Local”然后在代码主体开始之前的某个地方使用“Assembly.LoadFrom”是可行的吗?这样会起作用吗? - Rohit
你不需要使用 Assembly.LoadFrom,只需关闭 Copy Local,只要 DLL 仍然在你的引用路径中可用,你就完成了。或者,我应该说,在 .Net 框架能够找到它的某个地方仍然可用。 - Scott Pedersen
如果两个程序集(引用与加载)的版本不同,它会工作吗?如果运行时发现加载的程序集与构建的程序集不同,它会立即失败吗?还是只有在两个程序集之间存在某些不兼容性,例如 API 更改时才会失败。 - Rohit
您可以更改的另一个属性是“Specific Version”,将其设置为false,允许加载不同版本的程序集。只要不执行任何有重大变化的代码(例如带参数计数更改的方法),不同的版本就会运行。 我假设您不担心构建具有签名的强名称程序集,因为这种事情存在相当复杂的安全问题。 原因超出了此评论以及您的原始问题的范围。 - Scott Pedersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接