2014-09-04 7 views
5

Ich verwende Microsoft.Bcl.Async in meinem Word-Add-In, mein Add-In wird als EXE-Datei (test_addin.exe) kompiliert, die als Assembly aus Microsoft Word geladen wird. Wenn ich die ausführbare Datei direkt starte, funktioniert alles einwandfrei, aber wenn ich es von Word aus starte, bekomme ich eine Fehlermeldung, dass die Systems.Threading.Tasks Assembly nicht geladen werden konnte.Binden von Redirects für Office-Add-Ins

Could not load file or assembly System.Threading.Tasks... 

Es sieht so aus, dass seine Beziehung zu den bindenden Umleitungen, wenn ich versuche, die Anwendung von Word auszuführen es erwartet, dass die Konfigurationsdatei im 'C:\Program Files (x86)\Microsoft Office\Office15' Ordnern werden und WINWORD.exe.config benannt werden, das ist leider nicht möglich, da ich hat möglicherweise keinen Zugriff auf diesen Ordner.

Meine test_addin.exe.config Datei:

<?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> 

ich versucht habe AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Einstellung auf den richtigen Weg weisen, aber es scheint nicht zu helfen, gibt es andere Möglichkeiten, um es für eine Arbeit zu bilden Office-Add-In?

Antwort

3

Ich habe dieses Problem gelöst, indem eine benutzerdefinierte AssemblyResolve Handler Implementierung

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; 
     } 
    } 

Aber ich bin nicht sicher, es ist eine gute Lösung, so dass ich verlasse diese Frage offen für neue Antworten.

+0

Wie haben Sie das in Ihrem Code hinzugefügt? – SsjCosty

+1

Abonnieren Sie das AppDomain.AssemblyResolve-Ereignis. – animaonline