使绑定重定向适用于办公室加载项

ani*_*ine 5 c# office-interop assembly-resolution .net-assembly

我在我的Word插件中使用Microsoft.Bcl.Async,我的插件编译为exe(test_addin.exe)文件,从Microsoft Word作为程序集加载,当我直接启动可执行文件时,一切正常,但是当我从Word运行它时,我收到一个错误,说它无法加载Systems.Threading.Tasks程序集.

Could not load file or assembly System.Threading.Tasks...
Run Code Online (Sandbox Code Playgroud)

看起来它与绑定重定向有关,当我尝试从Word运行应用程序时,它期望配置文件位于'C:\Program Files (x86)\Microsoft Office\Office15'文件夹中并被命名WINWORD.exe.config,遗憾的是这是不可能的,因为我可能无法访问该文件夹.

我的test_addin.exe.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我试过设置AppDomain.CurrentDomain.SetupInformation.ConfigurationFile指向正确的路径,但它似乎没有帮助,是否有其他方法使其适用于Office加载项?

ani*_*ine 5

我已经通过实现自定义AssemblyResolve处理程序解决了此问题

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs e)
    {
        try
        {
            if (!e.Name.ToLower().StartsWith("system.threading.tasks"))
                return null;

            AddoDebug.Instance.WriteLine("Assembly_Resolve");
            var assemblyDetail = e.Name.Split(',');
            var assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            var assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll");

            return assembly;
        }
        catch (Exception ex)
        {
            AddoDebug.Instance.WriteLine("An exception occurred: " + ex, ADDOTraceStatus.Exception);
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我不确定这是否是一个好的解决方案,所以我将这个问题留给新的答案。