在项目之间共享动态链接库(DLL)

4
我在我的解决方案中有多个项目。每个项目都引用其他项目。dll文件非常大,我不希望它们包含在引用它们的每个项目的bin文件夹中。
我的选择有哪些?理想情况下,我希望将它们放在一个位置,并引用该位置,而不需要在每个项目的bin文件夹中包含它们。我能想到的唯一位置是GAC。是否有任何想法/建议,您是如何绕过此问题的?
是否可以使用probing路径?有人以前使用过这个吗?能否指点一下教程?
我尝试了probing路径,在运行应用程序时出现错误,这没有正确设置吗?我已将要从此路径加载的dll文件放置在C:\ Projects \ myProject \ bin文件夹中。并在引用中将复制设置为false。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="C:\Projects\myProject\bin"/>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

谢谢


你对于DLL文件存在多个位置的实际担忧是什么?磁盘空间的限制?构建时间?它们是否足够大,以至于复制它们需要相当长的时间? - Matt Mills
这不是你问题的答案,但如果你想要不将程序集放在全局程序集缓存(GAC)中的优点(每个程序更新DLL而不是全局更新,减少可能出现的问题),同时又不想让所有这些程序集都存在于同一个文件夹中,那么你可能需要看一下 ILMerge,它可以将你的程序集合并成一个。然而,拥有多个程序集的开销相对较小。 - Daniel A.A. Pelsmaeker
主要是磁盘空间问题,我想将我的dll文件集中到一个文件夹中,而不是分散在各处。将它们放入全局程序集缓存(GAC)的问题在于我依赖第三方库,其中一些没有强名称,这会变得有点棘手。 - newbie_86
2个回答

1
我猜你更喜欢在Visual Studio中引用程序集时关闭CopyLocal。步骤如下:
  1. 打开Solution Explorer
  2. 右键单击引用项(项目或程序集)
  3. 在上下文菜单中选择属性
  4. CopyLocal设置为False(默认值为True)
然后,引用将不会被复制到您的project\bin\debug等文件夹中。 更新 您仍然需要将依赖项复制到相同的文件夹、GAC或探测路径才能运行应用程序。这就是.Net解析程序集引用的方式。
您可以参考运行库如何定位程序集更新 1 MSDN指定程序集位置
使用<probing>元素 运行时通过探测来定位没有代码库的程序集。有关探测的更多信息,请参阅运行时如何定位程序集。 您可以在应用程序配置文件中使用<probing>元素来指定运行时在定位程序集时应搜索的子目录。以下示例显示了如何指定运行时应搜索的目录。
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <probing privatePath="bin;bin2\subbin;bin3"/>
    </assemblyBinding>
  </runtime>
</configuration>

privatePath 属性包含运行时应搜索程序集的目录。如果应用程序位于 C:\Program Files\MyApp,则运行时将在 C:\Program Files\MyApp\BinC:\Program Files\MyApp\Bin2\SubbinC:\Program Files\MyApp\Bin3 中查找未指定代码库的程序集。在 privatePath 中指定的目录必须是应用程序基目录的子目录。


尝试探测路径,运行应用程序时出现错误,请参见问题设置代码的编辑,有什么想法可能是问题? - newbie_86
错误信息为:无法加载文件或程序集“xxx,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其某个依赖项。系统找不到指定的文件。该文件在那个文件夹中,看起来就像它没有查找我的私有路径一样。 - newbie_86
嗨,我记得privatepath只能是应用程序当前文件夹下的目录。例如,您的app.exe位于c:\ myproject \ bin \ debug下,privatepath只能是类似于c:\ myproject \ bin \ debug \ subfolder \ 的东西。 - terry

1
你只能将引用的库添加到启动项目的输出文件夹中:
1)右键点击启动项目,选择“添加”,“现有项”。或在VS2010中使用默认设置按下[Shift]+[Alt]+[A]组合键。
2)更改类型选择器为“所有文件(*)”,找到并选择你的库。
3)将“添加”选择器更改为“添加为链接”,并按下它。
4)选择刚刚添加到项目中的链接,在属性窗口中将“复制到输出目录”设置为“始终复制”。现在,每次构建解决方案时,该库都会复制到您的启动项目的输出文件夹中。
5)如果你想限制将此dll复制到使用它的项目的输出中,请右键单击该项目中的引用,并在属性窗口中将“复制本地”设置为false。
影响:
你的引用dll仅出现在启动项目的输出目录中。
缺点:
如果你更改了启动项目,你需要再次将所有链接添加到它。
在解决方案资源管理器中,启动项目目录变得杂乱无序。

不,启动项目不应引用所有的dll。它只需要将它们添加到输出文件夹中即可。相反,其他项目必须引用它们的dll,但不要将它们复制到它们的文件夹中。我认为这正是你所需要的。 - astef
不完全遵循,但我会尝试,谢谢。这种方法有什么影响?这样做有什么缺点吗? - newbie_86
谢谢!我觉得那对我不适用。我有两个创业项目,经常切换,如果每次切换都要添加链接,那会很糟糕 :| - newbie_86
确认一下 - 我有一个创业项目,我在其中添加了Project1的参考链接。然后我有Project2,我向其添加对Project1的引用,并将复制到本地设置为False。那么,Project2如何知道从启动项目的bin文件夹中加载dll? - newbie_86
让我们在聊天室里继续这个讨论 - newbie_86
显示剩余5条评论

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