【问题标题】:Load available library version for use in COM library加载可用的库版本以在 COM 库中使用
【发布时间】:2017-05-07 04:32:24
【问题描述】:

所以我正在编写一个 C# 库,它将通过 COM 进行交互。该库使用 log4net 进行日志记录。现在这个 COM 库可能必须根据主机应用程序的安装版本加载不同版本的 log4net,所以我试图让它加载它安装目录中可用的任何版本的 log4net。现在我熟悉使用 BindingRedirects,但我以前从未在库中使用过它们,所以不知道如何使用。在 StackOverflow 上查找“相关”问题我遇到了控制程序集加载的解决方案。这是我尝试过的一个示例。

Assembly assembly = null;

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    string name = new AssemblyName(args.Name).Name;

    if (name.Equals("log4net"))
    {
        return assembly;
    }
    return null;
};

assembly = Assembly.LoadFrom("log4net.dll");

并编辑了 csproj,因此没有引用特定版本。

<Reference Include="log4net">
  <HintPath>..\packages\log4net.1.2.10\lib\2.0\log4net.dll</HintPath>
  <SpecificVersion>False</SpecificVersion>
</Reference>

但不管我做什么(我已经尝试了上面代码的几种变体)我都会得到这个异常:

无法加载文件或程序集'log4net,版本=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' 或其之一 依赖关系。定位程序集的清单定义不 匹配程序集引用。 (HRESULT 异常:0x80131040)

我有一种感觉,我在这里尝试完成的事情是可能的,但我只是走错了路。如果我能以这种方式应用 BindingRedirects,我也会选择一种使用专门为库量身定制的 app.config 文件的方法。我将不胜感激任何人对此提出的任何建议,无论好坏。

【问题讨论】:

    标签: c# logging dll com


    【解决方案1】:

    因此,如果有人遇到同样的问题,我有一个对我有用的解决方法。所以我决定使用 Fody weaver Costura https://github.com/Fody/Costura 在我的 COM dll 中嵌入 log4net。在我的 FodyWeavers.xml 中,我使用以下配置仅将 log4net 作为合并程序集包含在内。

    <Costura>
        <IncludeAssemblies>
          log4net
        </IncludeAssemblies>
    </Costura>
    

    我仍然很想看看是否可以动态加载任何版本的程序集 (log4net),但目前上述解决方案可以满足我的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多