Microsoft Application块DLL V2和V4.1引用

时间:2010-07-06 20:48:53

标签: .net assemblies reference versioning enterprise-library

我的应用程序引用Microsoft Enterprise库V4.1,而较旧的DLL(外部应用程序)之一需要引用Microsoft Enterprise库V2.0。我确信我可以在GAC中注册这两个程序集,应用程序将根据需要开始阅读相关的DLL,但这不是我们的解决方案,因为我们的安全专家不同意接受此解决方案。

有没有办法使用webconfig,我可以在整个应用程序使用4.V0时专门指定旧DLL使用V2.0。

注意:我们正在使用Asp.net visual Studio C#

迫切需要帮助! 感谢

更新:

尝试使用privatePath探测的解决方案:

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="bin;ExtDLL"/>
    </assemblyBinding>

我的Web文件夹现在有ExtDLL文件夹,其中包含用于Microsoft Enterprise库的V2.0.0.0 Dll,但是一旦我调用使用V2.0.0.0程序集的外部DLL函数,我仍然会得到以下异常: / p>

...System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

2 个答案:

答案 0 :(得分:1)

你尝试过这样的事吗?这是我用于在应用程序中支持多个版本的DLL的技术,同时避免使用GAC。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="MyLibrary" publicKeyToken="605f591b87e816bd"/>
    <codeBase version="1.0.0.0" href="./v1/MyLibrary.dll"/>
    <codeBase version="2.0.0.0" href="./v2/MyLibrary.dll"/>
  </dependentAssembly>
</assemblyBinding>

确保你有:

  1. 您的DLL名称很强
  2. 相应的目录结构(v1 / MyLibrary.dll和v2 / MyLibrary.dll)位于二进制文件夹中
  3. 这些“子文件夹”中出现的DLL都不应直接出现在二进制文件夹中。
  4. 这是一个简单的解决方案 - 但我建议您确定您的子文件夹名称与GAC相同,例如:

      

    ./在MyLibrary / 1.0.0.0__605f591b87e816bd / MyLibrary.dll

         

    ./在MyLibrary / 2.0.0.0__605f591b87e816bd / MyLibrary.dll

         

    ./ MyLibrary / 2.0.0.0_en_605f591b87e816bd / MyLibrary.dll(这是一个构建的示例,   本地化,卫星装配总是会出现这样的情况)

答案 1 :(得分:0)

我无法使用probing / privatePath或codebase配置加载两个版本的Enterprise Library。

我能够让它发挥作用的唯一方法是使用custom resolving of assembly loads.

我将2.0程序集放在应用程序bin目录中。然后我将4.1程序集放在bin(bin \ EL41)下名为EL41的目录中。然后我添加了自定义事件处理程序以尝试通过添加

来解决程序集
AppDomain.CurrentDomain.AssemblyResolve += newResolveEventHandler(MyResolveEventHandler);

启动代码,然后创建MyResolveEventHandler

private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
    string[] assemblyInfo = args.Name.Split(',');
    return Assembly.LoadFrom(@"file:///C:/Documents and Settings/My Documents/Visual Studio 2008/Projects/App/bin/EL41/" + assemblyInfo[0] + ".dll");
}

这肯定会起作用。您可以将路径放置在配置中以避免对位置进行硬编码,但对我来说仍然感觉不对。我想知道是否有一种不太干扰的方式来做你想做的事。