【问题标题】:Renaming of .Net assemblies.Net 程序集的重命名
【发布时间】:2014-05-13 16:41:09
【问题描述】:

我们从第三方获取程序集,例如Example.dll。最近供应商引入了一些重大更改,但没有更改组件的名称。我可以将新程序集重命名为例如Example2.dll 并使用反射动态加载它?它没有被强烈命名。

【问题讨论】:

  • 当然你可以重命名它,因为它不是强命名的,但不会改变使用的命名空间,如果加载在同一个AppDomain中会与其他程序集冲突。跨度>
  • @NathanA 我相信如果他使用反射,他实际上仍然可以从Assembly 对象中正确解析这些类型。不过,此代码很快就会变得非常笨拙
  • @Habib,我想这就是我正在经历的。知道如何在不重新编译 dll 的情况下绕过它吗?
  • @Grzenio,我认为如果不重新编译 dll 就无法做到这一点。

标签: c# .net .net-assembly


【解决方案1】:

是的,你可以重命名它,因为它不是强命名的,但是,这不会改变程序集使用的命名空间,如果它们加载到同一个 AppDomain 中,它会与其他程序集冲突。

假设您想同时使用这两个版本,我能想到的唯一解决方案是将其加载到单独的 AppDomain 中并使用代理进行调用。不过,我不会详细介绍如何做到这一点,因为它可能会变得非常复杂。我的建议是,向供应商推回以更正破坏代码,或为您提供重命名的程序集。

以下是帮助您入门的参考:http://msdn.microsoft.com/en-us/library/yk22e11a(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    是的,您可以通过调用 Assembly.LoadFileAssembly.LoadFrom 或类似方法按名称加载任何程序集。推荐的方法是LoadFrom,因为它将程序集加载到默认加载上下文中,并加载依赖程序集。但请记住,实际的 AssemblyName 不会因文件重命名而改变。不过,也有一些工具可以为您更改程序集名称。

    【讨论】:

    • 能否详细说明我可以使用哪些工具?
    • 我将从 ILMerge 开始。该程序合并 .net 程序集。我很确定它应该能够重命名它。我会做一些研究...
    • 我很确定 IL 合并不会有帮助。您可能会发现 IldasmIlasm 很有帮助。您可以重命名程序集并构建新程序集,但请检查您是否违反任何许可。
    • @SriramSakthivel:实际上我认为它应该可以正常工作。选择原始 dll 作为输入程序集,并指定新名称作为输出程序集。它只有一个要合并的文件,所以也许它只会更改名称。
    • 合并有什么好处?您会遇到类型名称冲突,不是吗?
    【解决方案3】:

    我正是使用 AutoMapper dll 完成的。我的解决方案中需要这两个版本,但只是在我的应用程序项目中(在 dll 文件夹中)包含了非标准版本,并将此部分添加到配置文件的运行时部分。

      <dependentAssembly>
        <assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
        <codeBase version="6.1.1.0" href="dlls\AutoMapper.dll" />
      </dependentAssembly>
    

    如果第 3 方 dll 发生变化(我们从 Nuget 获取),我只需要记住手动更新 dll 文件夹。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多