是否有可能在类中具有与版本无关的DLL引用?

时间:2009-05-14 00:01:54

标签: .net visual-studio dll build-process dependencies

我想创建一个编译成单个DLL的类。此DLL将为现有产品添加功能。

为了使其工作,自定义类引用底层产品中包含的DLL。编译时需要这些引用。

这里的一切正常,自定义类编译。我可以将生成的DLL放到产品中,一切正常。

但是,此产品有多个版本(次要版本,服务包)。我想将此DLL分发给其他人,但我发现DLL必须与完美匹配产品的版本。如果没有完美匹配,则会发生以下错误:

  

无法加载文件或程序集   'Product.Web.UI,Version = 3.6.1920.2,   文化=中性,   PublicKeyToken = dfeaee0e3978ac79'或   其中一个依赖项。位于   程序集的清单定义   与程序集引用不匹配。   (HRESULT异常:0x80131040)

如何生成一个对版本引用不挑剔的DLL?

3 个答案:

答案 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. 您可以进行部分参考。请参阅此文:http://msdn.microsoft.com/en-us/library/0a7zy9z5(VS.71).aspx
  2. 您可以在web.config中使用绑定重定向声明兼容版本。请参阅此文:http://msdn.microsoft.com/en-us/library/433ysdt1.aspx
  3. 一般情况下,建议使用第二种方法,因为: 1.您不能在全局程序集缓存中使用对程序集的部分引用,这意味着如果程序集在GAC中,则控件将抛出相同的异常。 2.您明确说明兼容版本。

答案 2 :(得分:0)

在VisualStudio中 - 您是否尝试右键单击引用的程序集(dll)然后选择属性并设置“需要特定版本”(或左右)? 这可能会解决您的问题。

安德烈亚斯