将引用添加到GAC,程序集递归复制非GAC依赖程序集(C# Visual Studio 2008)

3
这是我的应用程序部署: c:\Program Files\Product\API.dll(在Gac中注册) c:\Program Files\Product\ApiImpl1.dll(非Gac) c:\Program Files\Product\ApiImpl2.dll(非Gac) c:\ConsoleApplication\TestApi.exe Api.dll是实现“c:\Program Files\Product\”的应用程序Facade。 Api.dll已在GAC中注册,并具有解析位于“c:\Program Files\Product\”中DLL的程序集解析器。 Api.dll引用了ApiImpl1.dll和ApiImpl2.dll。
问题是,当我在ConsoleApplication中添加对Api.dll的引用时,Visual Studio会将ApiImpl1.dll和ApiImpl2.dll递归地复制到项目目标位置。(尽管CopyLocal=False) 我通过浏览“c:\Program Files\Product\API.dll”来添加引用。
据我所知,我有几个解决方案: 1)在GAC中注册ApiImpl1.dll和ApiImpl2.dll(不可接受,因为我已经有程序集解析器); 2)添加到“.Net Add Reference”注册表,“c:\Program Files\Product”(无法解决); 3)添加到“.Net Add Reference”注册表,“c:\windows\Assembly\gac_msil\Api.dll”(虽然可以解决,但这是个不好的解决办法); 4)手动更改ConsoleApplication.csproj并删除Api.dll引用的HintPath属性。(不可接受,因为我将有很多客户使用此API)。

“CopyLocal=False” - 这是在 API.dll 还是 ApiImpl1.dll 上? - Marc Gravell
1个回答

0

你应该始终将依赖于GAC的dll文件放在GAC中...如果其中一个需要在那里,其他的也需要。

问题在于,虽然Visual Studio知道通过引用找到这些dll文件的位置,但是运行时的应用程序如果dll文件不在项目目录中,就不知道在哪里查找(因此需要复制)。


编辑
如果您有程序集解析器,是否有必要将API.dll放入GAC中?也许如果该dll不在GAC中,Visual Studio就不会复制其他文件。我相当确定这是一个根DLL在GAC中,而依赖的DLL不在其中的事实。


我知道这是不好的做法。但是在运行时,我有一个解析器,可以找到没有位于GAC中的Dlls。问题是Visual Studio不知道我有AssemblyResolver。 - Aviram
我知道有方法可以使其工作...但是,就像你看到的那样,它会引起问题。此外,我不知道您在使用程序集解析程序时拥有什么细粒度控制权,但是GAC将自动控制版本,安装到GAC提供了一种受控的部署方法。如果依赖程序集解析程序,您必须将AR与应用程序一起部署(尽管可能只需要部署到一个服务器上?) - James King

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