2012-02-14 51 views
1

在我的web和worker角色中,我引用了核心框架DLL的替代版本。该文件标记为Copy Local。 Visual Studio在项目引用中显示正确的版本。编译项目时,bin目录也包含正确的版本。Azure包中包含不正确的DLL

但是,当我要求Visual Studio创建一个Azure包时,该包(以及包装期间创建的csx文件夹)仅包含用于Worker角色的错误(原始)DLL。 Web角色具有正确的DLL。如果我手动使用cspack,则不会发生这种情况,但这不是一个真正想要打包的方法。

什么会导致Visual Studio使用正确的引用DLL进行编译,但绑定了错误的引用?

附加信息: 当我运行msbuild做包装,而不是Visual Studio中,我看到了下面两行:

Copying file from "C:\Users\bytenik\Dropbox\Treadmarks\lib\EntityFramework\System.Data.Entity.dll" to "C:\Users\bytenik\Dropbox\Treadmarks\src\Azure\obj\Debug\Worker\System.Data.Entity.dll". 
Copying file from "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.Entity.dll" to "C:\Users\bytenik\Dropbox\Treadmarks\src\Azure\obj\Debug\Worker\System.Data.Entity.dll". 

因此,它似乎复制我的参考,然后在它复制与系统参考。

注意:我很清楚替换.NET CLR DLL的整个概念是一个巨大的破解。当.NET 4.5出来支持我需要的功能时,这一切都将被剥离。同时,我需要能够继续发展。

这是对问题“Azure References Incorrect DLL”的替换,它实际上是不正确的,并导致有效的答案,但没有解决我的问题。

+0

以供将来参考它会更好重新写了原来的问题。谢谢。 – Kev 2012-02-14 15:51:22

+0

@Kev我想过,但所有的答案都没有意义。 – 2012-02-14 15:53:43

回答

1

即使Visual Studio项目对GAC中的程序集的本地和/或修改副本有引用,它也将在编译期间使用,但在运行时,CLR将始终加载程序集来自GAC,即使它坐在与您的应用程序相同的目录中。

因此,该解决方案不涉及找出一个聪明的方式来打包或部署修改后的程序集,但要弄清楚如何使CLR实际加载它的方法。

两个可能的解决方案:

1)使用角色启动任务和安装工程来部署大会在生产服务器上的GAC修改后的版本。

2)删除程序集的签名并确保所有引用都是在没有签名的情况下对此版本进行的。注意其他可能引用原始签名版本的程序集,并尝试从GAC加载它。

有关详细信息和链接查看How to prevent a .NET application to use an assembly from the GAC?