我的应用程序引用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)
答案 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>
确保你有:
这是一个简单的解决方案 - 但我建议您确定您的子文件夹名称与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");
}
这肯定会起作用。您可以将路径放置在配置中以避免对位置进行硬编码,但对我来说仍然感觉不对。我想知道是否有一种不太干扰的方式来做你想做的事。