加载可用库版本以在COM库中使用

时间:2016-12-21 16:59:38

标签: c# logging dll com

所以我正在编写一个将通过COM连接的C#库。此库使用 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,Version = 1.2.10.0,   Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)

我有一种感觉,我在这里想要完成的事情是可能的,但我只是以错误的方式去做。如果我可以通过这种方式应用BindingRedirects,我也会选择使用专门为库定制的app.config文件。我很感激任何人对此有任何建议。无论好坏。

1 个答案:

答案 0 :(得分:0)

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

IntentService

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