2012-03-27 13 views
5

Ho creato un componente aggiuntivo Outlook VSTO che utilizza una libreria Html2Xhtml.dll (.NET) che chiama un altro Html2xhtml.exe eseguendo System.Diagnostic.Process.Start().Trova Installa directory e directory di lavoro del componente aggiuntivo Outlook di VSTO; o qualsiasi Office Addin

Tuttavia, non riesce a chiamare Html2xhtml.exe (credo) perché la directory di lavoro, anche quando viene lanciata da Visual Studio, è la cartella Documenti dell'utente corrente. Non ho il controllo del codice in Html2Xhtml.dll, quindi non posso usare il percorso assoluto; ma suppongo di poter cambiare la directory di lavoro del componente aggiuntivo in fase di esecuzione.

Tuttavia, se installo questo tramite ClickOnce o qualche altro mezzo in cui non conosco il percorso di installazione che l'utente sta per scegliere, come suppongo di trovare il mio Html2xhtml.exe?

risposta

16

Ho trovato la risposta here, crediti completi per robindotnet.wordpress.com.

//Get the assembly information 
System.Reflection.Assembly assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly(); 

//Location is where the assembly is run from 
string assemblyLocation = assemblyInfo.Location; 

//CodeBase is the location of the ClickOnce deployment files 
Uri uriCodeBase = new Uri(assemblyInfo.CodeBase); 
string ClickOnceLocation = Path.GetDirectoryName(uriCodeBase.LocalPath.ToString()); 
1

Questo è un problema reale con cui ho dovuto combattere per un po 'di tempo. La soluzione utilizzata in un AddIn con cui dovevo lavorare era scrivere la directory di installazione nel registro e leggere il valore da lì. In quel modo si potevano trovare cose che non potevano essere incorporate nell'exe. Questa non è una buona soluzione, ma ha funzionato.

Perché MS si attiene a questo stupido "meccanismo di sicurezza" di copiare la DLL in una directory casuale è un segreto che probabilmente non rivelerà mai.

Mentre scrivevo il mio commento, in realtà avevo un'idea che non avevo provato fino ad ora: fai in modo che il tuo installatore copi i file necessari in seguito su% appdir% \ YourCompany \ YourApplication \ libs o altri. Dovresti essere in grado di trovare le tue cose poi durante il runtime.

+0

questa potrebbe essere l'ultima risorsa ... vedi se qualcuno arriva con un'idea migliore. – Jake

+0

Bene, ho provato tutti i tipi di materiale per la riflessione. Il fatto è che l'assemblea viene copiata in una posizione casuale e quindi non riesce a trovare alcun file portato con sé. Se non vuoi scrivere nel registro puoi ... cercare? Ma questo potrebbe lasciarti alla ricerca di tutte le unità. –

3

Ho avuto un problema simile e l'ho risolto nello stesso modo descritto da Christoph, vorrei anche sapere se ci sono dei modi alternativi per farlo ma se non trovi nulla ecco un esempio

1) Creare una libreria azioni personalizzate con il seguente InstallerClass

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Configuration.Install; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using Microsoft.VisualStudio.Tools.Applications; 
using Microsoft.Win32; 

namespace Setup.CustomActions 
{ 
    [RunInstaller(true)] 
    public partial class AddCustomization : Installer 
    { 
     static readonly Guid solutionID = new Guid("d6680661-c31e-4c24-9492-5919dc0uagt5"); 
     public override void Install(IDictionary stateSaver) 
     { 
      string installPath = Context.Parameters["installPath"]; 
      if(!String.IsNullOrEmpty(installPath)) 
      { 
       AddTemplateToAvailableTemplates(installPath); 
      }   
      base.Install(stateSaver); 
     } 

     public override void Rollback(IDictionary savedState) 
     { 
     } 

     public override void Uninstall(IDictionary savedState) 
     { 
     } 

     private void AddTemplateToAvailableTemplates(string installPath) 
     { 
      //The example below is very basic, put in checks to see whether the registry key already exists and so on 
      RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\Common", true); 
      RegistryKey acturisKey = key.CreateSubKey(@"Spotlight\MyAppInstallPath"); 
      acturisKey.SetValue("InstallPath", installPath);h); 
     } 
    } 
} 

2) Nel progetto di installazione crea una chiave sull'azione installazione personalizzata che punta alla directory di installazione: Install custom action

Se hai bisogno di maggiori informazioni o vuoi scaricare la fonte dai un'occhiata a this msdn post da Open Xml MVP Wouter Van Wugt intitolato "Distribuzione di strumenti Visual Studio 2010 per Office utilizzando Windows Installer"

+0

Grazie mille, questo è utile per me. =) – Jake

+0

Questo può essere datato, ma è buono informazioni. Si prega di vedere la mia ultima risposta qui sotto ho trovato. – Jake

0

Aveva lo stesso problema per le applicazioni ClickOnce. Ecco cosa dovete fare per ottenere il percorso di distribuzione del componente aggiuntivo:

Aggiungi riferimento System.Deployment.Application nell'applicazione

successivo è quello di utilizzare questa proprietà per recuperare il percorso di distribuzione:

ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString() 

e ci sei!

Problemi correlati