在项目之间共享DLL

在项目之间共享DLL,dll,gac,Dll,Gac,我的解决方案中有多个项目。每个项目都引用其他项目。DLL非常大,我不希望它们包含在引用它的每个项目的bin中 我有什么选择?理想情况下,我希望将它们放在一个位置并引用,而无需将它们包含在每个项目的bin文件夹中。我能想到的唯一地点就是GAC。你对如何解决这个问题有什么想法/建议吗 可以使用探测路径吗?以前有人用过这个/给我指一个教程吗 我尝试过探测路径,运行应用程序时出现错误,是否设置不正确?我已将希望从此路径加载的DLL放在C:\Projects\myProject\bin文件夹中。并在引用中

我的解决方案中有多个项目。每个项目都引用其他项目。DLL非常大,我不希望它们包含在引用它的每个项目的bin中

我有什么选择?理想情况下,我希望将它们放在一个位置并引用,而无需将它们包含在每个项目的bin文件夹中。我能想到的唯一地点就是GAC。你对如何解决这个问题有什么想法/建议吗

可以使用探测路径吗?以前有人用过这个/给我指一个教程吗

我尝试过探测路径,运行应用程序时出现错误,是否设置不正确?我已将希望从此路径加载的DLL放在C:\Projects\myProject\bin文件夹中。并在引用中将copy设置为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>


谢谢

您只能将引用库添加到启动项目的输出文件夹中:

1) 右键单击启动项目“
添加”
”、“
现有项”
”。或VS2010中的[Shift]+[Alt]+[A]组合,带有默认值

2) 将类型选择器更改为“
所有文件(*)
”,查找并选择您的库

3) 将“添加”选择器更改为“
添加为链接
”,然后按它

4) 选择刚刚添加到项目中的链接,并在“属性”窗口中将“
复制到输出目录
”设置为“
始终复制
”。现在,每次构建解决方案时,该库都会复制到启动项目的输出文件夹中

5) 如果要限制将此dll复制到使用它的项目的输出,请右键单击该项目中的引用,然后在属性窗口中将“
复制本地”
”设置为false

含义:

引用的dll将出现的唯一位置是启动项目的输出目录

缺点:

如果要更改启动项目,则需要再次添加指向该项目的所有链接


解决方案资源管理器中的启动项目目录变得凌乱。

我想您更喜欢的是,在Visual Studio中引用程序集时关闭
CopyLocal

这些步骤可以是:

  • 打开
    解决方案资源管理器
  • 在参考项(项目或部件)上单击鼠标右键
  • 在关联菜单中选择
    Properties
  • CopyLocal
    设置为
    False
    (默认值为true)
  • 这样,引用就不会被复制到
    项目\bin\debug
    等中

    更新

    您仍然需要将依赖项复制到同一文件夹、GAC或探测路径以运行应用程序

    这就是.Net解析程序集引用的方式

    你可以参考

    更新1

    使用
    元素 运行库通过探测来定位没有代码库的程序集。有关探测的详细信息,请参见运行时如何定位程序集。 您可以使用应用程序配置文件中的元素指定运行时在定位程序集时应搜索的子目录。下面的示例显示了如何指定运行时应该搜索的目录

    <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\Bin
    C:\Program Files\MyApp\Bin2\Subbin
    C:\Program Files\MyApp\Bin3
    中指定代码库的程序集。
    privatePath
    中指定的目录必须是应用程序基目录的子目录。

    将DLL放在多个位置的实际问题是什么?磁盘空间限制?构建时间?它们是否真的足够大,以至于需要相当长的时间来复制它们?这不是对您问题的回答,但如果您希望获得GAC中没有程序集的优势(更新每个程序的DLL,而不是全局更新,以减少可能的问题)同时,如果您不希望所有这些程序集都位于同一个文件夹中,那么您可能需要查看哪些程序集将合并到一个文件夹中。但是,拥有多个程序集的开销相对较小。主要是磁盘空间,我想集中我的DLL,所以它们都在一个文件夹中,而不是到处都是。将它们放在GAC中的问题是,我依赖于第三方库,其中一些库的名称不太明确,这有点棘手。因此,如果我理解正确,我会将它们添加到一个中心文件夹,然后在我的启动项目中将它们作为链接引用,然后在所有其他项目中引用它们,但不复制到bin?这意味着启动项目必须引用我的所有DLL?嗯,不是很理想…不,启动项目不能引用所有的dll。它只需将它们添加到输出文件夹。相反,其他项目必须引用其dll,但不能将其复制到文件夹中。这正是你所需要的,我想没有完全遵循,但我会试一试,谢谢,这种方法的含义是什么?这样做有什么坏处吗?如果解释不清楚,请询问。关于影响和缺点-我将在几分钟内编辑我的答案!我认为这对我不起作用。我有两个启动项目要交换,如果每次交换都要添加链接,那将是一场噩梦:|尝试探测路径,运行应用程序时出错,请参阅“编辑到问题”获取设置代码,有什么想法吗?错误是无法加载文件或程序集“xxx”,版本=1.0.0.0,区域性=中性,PublicKeyToken=null'或其依赖项之一。系统找不到指定的文件。它就在那个文件夹里,就像它没在看我的隐私一样