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

Gab*_*ner 19 .net dll dependencies build-process visual-studio

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

为了使其工作,自定义类引用基础产品中包含的DLL.编译需要这些引用.

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

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

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

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

Yoe*_*fen 7

这是一个很好的解决方案.它为我解决了类似的问题.

在.NET中编译与版本无关的DLL

如果链接永远消失,关键是处理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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*ner 4

我还没有问题的答案,但我将使用这个答案来记录我在寻找解决方案时发现的面包屑。

我在 StackOverflow 上发现了一个有点相关的问题:

在 .NET 中编译版本无关的 .DLL(使用清单?)

然而,我没有能力修改底层产品,所以答案对我不起作用。


更新:

我给比我聪明得多的人发了一封电子邮件,回复如下:

当引用强名称程序集时,默认情况下 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

一般来说,建议使用第二种方法,因为: 1. 您不能对全局程序集缓存中的程序集使用部分引用,这意味着如果程序集位于 GAC 中,您的控件将引发相同的异常。2. 您明确声明兼容版本。