Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加载可用的库版本以在COM库中使用_C#_Logging_Dll_Com - Fatal编程技术网

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

C# 加载可用的库版本以在COM库中使用,c#,logging,dll,com,C#,Logging,Dll,Com,因此,我正在编写一个C#库,它将通过COM与之连接。此库使用log4net进行日志记录。现在,这个COM库可能必须根据主机应用程序的安装版本加载不同版本的log4net,因此我尝试将其设置为能够加载其安装目录中可用的任何版本的log4net。现在我熟悉使用绑定重定向,但我以前从未在库中使用过它们,因此不知道如何使用。查找有关StackOverflow的“相关”问题,我发现了控制程序集加载的解决方案。这是我尝试过的一个例子 Assembly assembly = null; AppDomain.

因此,我正在编写一个C#库,它将通过COM与之连接。此库使用log4net进行日志记录。现在,这个COM库可能必须根据主机应用程序的安装版本加载不同版本的log4net,因此我尝试将其设置为能够加载其安装目录中可用的任何版本的log4net。现在我熟悉使用绑定重定向,但我以前从未在库中使用过它们,因此不知道如何使用。查找有关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>

..\packages\log4net.1.2.10\lib\2.0\log4net.dll
假的
但无论我做什么(我已经尝试了上述代码的几种变体),我都会遇到以下异常:

无法加载文件或程序集的log4net,版本=1.2.10.0, 区域性=中性,PublicKeyToken=1b44e1d426115821'或其 依赖关系。定位程序集的清单定义不正确 匹配程序集引用。(来自HRESULT的异常:0x8013100)


我有一种感觉,我试图在这里完成的是可能的,但我只是走错了方向。如果我能以这种方式应用绑定重定向,我也会选择一种使用专门为库定制的app.config文件的方法。我将非常感谢任何人对此提出的建议,无论是好的还是坏的。

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

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

log4net

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

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

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

log4net
我仍然很想看看是否有可能动态加载任何版本的程序集(log4net),但是现在上面的解决方案满足了我的需要