【问题标题】:Referencing dlls without copying them C#引用 dll 而不复制它们 C#
【发布时间】:2015-08-05 10:07:15
【问题描述】:

当我们新建一个 C# 项目并引用一个 dll 时,该 dll 会在编译项目时复制到项目的输出目录中。

有没有办法引用 dll 文件而不是将它们复制到项目的输出目录,并在运行时让可执行文件与它们一起工作(如果我没记错的话,类似于 Assemblies)?

我尝试访问引用 dll 的属性,并将 Copy Local 更改为 False 但没有帮助(可能是因为该 dll 依赖于 dll 目录中的其他 dll)。

有什么办法吗?

【问题讨论】:

  • 为什么不希望 dll 出现在输出目录中?
  • 请澄清。您的意思是更改 Copy local 并没有改变任何内容,并且程序集仍被复制到输出文件夹,还是您的意思是如果未在本地复制,则无法找到该程序集。如果后者没有魔法可以在任何需要将它们放在路径、GAC 或在 app.config 中配置的地方找到程序集。

标签: c# dll reference assemblies copy-local


【解决方案1】:

实际上,您可以将程序集复制到 GAC,但这并不总是理想的解决方案。

您必须记住,复制到 GAC 的每个程序集都必须是强命名。如果您的项目使用了一些 NuGet 包,那么将所有这些包安装到 GAC 中会出现问题。我相信这也不是使用 NuGet 的目的。

另一种选择是使用配置中的<codeBase> 标记从默认bin 文件夹的不同目录加载您的DLL:

<configuration>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="MyAssembly2"  culture="neutral" publicKeyToken="307041694a995978"/>
        <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
     </dependentAssembly>
  </assemblyBinding>
</runtime>
</configuration>

但我记得在运行时是可能的。

编辑:由于您的问题是您必须参考正在开发的 SDK,我认为 GAC 和 codeBase 都不起作用。一件事是版本控制问题(您必须参考特定的 SDK 版本),另一件事是您应该在新的 SDK 发布后始终重新编译您的工具,因为您的程序集中存储了一些元数据,这些元数据可能会因新的 SDK 版本而过时。

【讨论】:

  • 问题是我们正在开发 SDK 安装,我正在开发使用 SDK 的工具。如果将dll复制到工具的输出目录,那么每次安装新的SDK版本时,都需要重新编译工具。基于此,还是不​​推荐使用 GAC 吗?
  • @Idanis - 考虑到使用 GAC 有一些您必须注意的缺点。如果您使用的是正在开发的 SDK,我相信您必须始终重新编译您的工具 - 每个 SDK 都应该分配新的程序集版本,因此使用 GAC 或codeBase 将不起作用,因为它需要参考特定版本。
  • 感谢您的回复。最后一个问题 - 如果 SDK 处于成熟阶段,我使用的部分很少更改怎么办?
  • @Idanis - 然后将其存储在 GAC 中或使用 codeBase 可能是一个可行的解决方案。使用 GAC 的缺点是您必须在每个客户端的计算机上安装所需的程序集(如果您有服务器端应用程序,则情况并非如此)。但您必须记住,您仍然应该参考特定版本并在新的 SDK 版本发布后重新检查您的工具(并在必要时重新编译它)。
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多