在项目之间共享DLL

时间:2013-05-17 10:39:20

标签: dll gac

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

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

是否可以使用探测路径?之前有人使用过这个/指向我的教程吗?

我尝试过探测路径,在运行应用程序时遇到错误,这是不是设置正确?我已经放置了我希望从C:\ Projects \ myProject \ bin文件夹中的此路径加载的dll。并在参考

中将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>

由于

2 个答案:

答案 0 :(得分:1)

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

1)右键单击开始项目“Add”,“Existing Item”。或VS2010中的[Shift]+[Alt]+[A]组合,默认值为。

2)将类型选择器更改为“All files (*)”,找到并选择您的库。

3)将“添加”选择器更改为“Add As Link”并按下它。

4)选择刚刚添加到项目中的链接,然后在“属性”窗口中将“Copy to Output Directory”设置为“Copy always”。现在,每次构建解决方案时,此库都将复制到启动项目的输出文件夹中。

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

<强>意义:

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

<强>缺点:

如果您要更改启动项目,则需要再次添加所有链接。

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

答案 1 :(得分:1)

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

步骤可以是:

  1. 打开Solution Explorer
  2. 右键单击参考项目(项目或装配)
  3. 在上下文菜单中选择Properties
  4. CopyLocal设为False(默认为true)
  5. 然后,引用不会被复制到您的project\bin\debug或等等。

    <强>更新

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

    这就是.Net如何解析程序集引用。

    您可以参考How the Runtime Locates Assemblies

    更新1

    MSDN Specifying an Assembly's Location

    使用<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中指定的目录必须是应用程序基目录的子目录。