我想创建一个编译成单个DLL的类。此DLL将为现有产品添加功能。
为了使其工作,自定义类引用底层产品中包含的DLL。编译时需要这些引用。
这里的一切正常,自定义类编译。我可以将生成的DLL放到产品中,一切正常。
但是,此产品有多个版本(次要版本,服务包)。我想将此DLL分发给其他人,但我发现DLL必须与完美匹配产品的版本。如果没有完美匹配,则会发生以下错误:
无法加载文件或程序集 'Product.Web.UI,Version = 3.6.1920.2, 文化=中性, PublicKeyToken = dfeaee0e3978ac79'或 其中一个依赖项。位于 程序集的清单定义 与程序集引用不匹配。 (HRESULT异常:0x80131040)
如何生成一个对版本引用不挑剔的DLL?
答案 0 :(得分:7)
这是一个很好的解决方案。它为我解决了类似的问题。
Compile a version agnostic DLL in .NET
如果链接死了,关键是处理AppDomain.CurrentDomain.AssemblyResolve事件,如下所示。只要程序集绑定失败,事件就会触发,因此您可以自行解决它,修复版本冲突。
using System.Reflection;
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e)
{
AssemblyName requestedName = new AssemblyName(e.Name);
if (requestedName.Name == "Office11Wrapper")
{
// Put code here to load whatever version of the assembly you actually have
return Assembly.LoadFile("Office11Wrapper.DLL");
}
else
{
return null;
}
}
}
答案 1 :(得分:4)
我还没有回答我的问题,但我会用这个答案记录我在搜索解决方案时发现的面包屑。
我在StackOverflow上发现了一个有点相关的问题:
Compile a version agnostic .DLL in .NET (Using Manifests?)
我无法修改基础产品,所以答案对我不起作用。
<强>更新强>
我通过电子邮件发送了比我更聪明的人,这是答复:
当您引用强名称程序集时,默认情况下Visual Studio会添加对引用程序集的完整引用。这意味着它包括程序集的名称,确切的版本,文化和公钥令牌。如果任何此类信息不匹配,则抛出所描述的异常。
删除程序集的强名称根本不是一种选择。我不会详细说明原因,但你可以在MSDN上做一些研究。
因此,您有两种方法可以针对您引用的每个版本的程序集进行构建。
一般情况下,建议使用第二种方法,因为: 1.您不能在全局程序集缓存中使用对程序集的部分引用,这意味着如果程序集在GAC中,则控件将抛出相同的异常。 2.您明确说明兼容版本。
答案 2 :(得分:0)
在VisualStudio中 - 您是否尝试右键单击引用的程序集(dll)然后选择属性并设置“需要特定版本”(或左右)? 这可能会解决您的问题。
安德烈亚斯