2014-09-04 13 views
5

Sto usando Microsoft.Bcl.Async nel mio addin di Word, il mio addin è compilato come un file exe (test_addin.exe), che viene caricato come un assembly da Microsoft Word, quando avvio l'eseguibile direttamente, tutto funziona correttamente, ma quando lo eseguo da Word, ricevo un errore che indica che non è stato possibile caricare l'assembly Systems.Threading.Tasks.Rileggere i reindirizzamenti di lavoro per i componenti aggiuntivi di Office

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

Sembra che la sua relativa ai redirect vincolanti, quando provo ad eseguire l'applicazione da Word che si aspetta il file di configurazione per essere collocata nella cartella 'C:\Program Files (x86)\Microsoft Office\Office15' e essere nominato WINWORD.exe.config, che purtroppo è impossibile perché io potrebbe non avere accesso a quella cartella.

Il mio file 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> 

Ho provato a fissare AppDomain.CurrentDomain.SetupInformation.ConfigurationFile per indicare il percorso corretto, ma non sembrano aiutare, ci sono altri modi per farlo funzionare per un Componente aggiuntivo di Office?

risposta

3

ho risolto questo problema mediante l'attuazione di un gestore AssemblyResolve personalizzato

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

Ma io non sono sicuro che sia una buona soluzione, così sto lasciando aperta la questione di nuove risposte.

+0

Come hai aggiunto questo nel tuo codice? – SsjCosty

+1

Iscriviti all'evento AppDomain.AssemblyResolve. – animaonline

Problemi correlati