我们从第三方获得一个集会,例如Example.dll
。最近供应商介绍了一些重大变化,但没有改变装配的名称。我可以将新装配重命名为例如Example2.dll
并使用反射动态加载它?它没有强烈的名字。
答案 0 :(得分:3)
是的,您可以重命名它,因为它没有强名称,但是,它不会更改程序集使用的命名空间,如果它们加载到另一个程序集中它将与另一个程序集冲突应用程序域。
我能想到的唯一解决方案,假设您希望同时使用这两个版本,就是将其加载到单独的AppDomain中并使用代理进行调用。我不打算详细介绍如何做到这一点,因为它会变得非常复杂。我的建议是,回到供应商处纠正破解代码,或者给你一个重命名的程序集。
以下是帮助您入门的参考资料:http://msdn.microsoft.com/en-us/library/yk22e11a(v=vs.110).aspx
答案 1 :(得分:0)
是的,您可以通过调用Assembly.LoadFile
或Assembly.LoadFrom
或类似方法按名称加载任何程序集。推荐的方法是LoadFrom
,因为它将程序集加载到默认的加载上下文中,并且还加载依赖程序集。但请记住,实际的AssemblyName不会因文件重命名而改变。有些工具可以为你更改程序集名称。
答案 2 :(得分:0)
我使用AutoMapper dll做到了这一点。我在我的解决方案中需要两个版本,但只是在我的应用程序项目中包含非标准版本(在dll文件夹中),并将此部分添加到配置文件的运行时部分。
<dependentAssembly>
<assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
<codeBase version="6.1.1.0" href="dlls\AutoMapper.dll" />
</dependentAssembly>
如果第三方dll发生变化(我们从Nuget获取),我只需要记住手动更新dll文件夹。