2009-08-06 20 views
0

Ich benutze .net primäre Interoperabilität Assembly für Excel in meinem Code. Die Anwendung kann jedoch auf einer Maschine ausgeführt werden, auf der .net PIA für Excel nicht installiert ist. Ich möchte eine Fehlermeldung geben, wenn es nicht installiert istWie überprüft man, ob .net Interoperabilität für Excel installiert ist

Obwohl ich GAC einchecke, um zu sehen, ob PIA installiert ist und nur wenn es vorhanden ist, verwende ich Microsoft.Office.Interop.Excel verwandten Code. Ich erhalte einen Fehler.

Mein Problem ist - ich bin Fehler immer die - Unbehandelte Ausnahme - nicht finden können, Datei oder Assembly Microsoft.Office.Interop.Excel

Jede Lösung laden konnte?

Vielen Dank im Voraus!

+0

Welche Version von Office zielen Sie ab? –

+0

Und in welcher Sprache entwickeln Sie sich? C# oder VB? –

+0

Achten Sie auf die Office-Version. Die Interop-Version für Office 2003 ist 11.0, während für Office 2007 12.0 ist. – danish

Antwort

0

Ich vermute System.Type.GetTypeFromProgID ("Excel.Application", true); Die Methode wird eine Ausnahme auslösen, wenn Excel nicht vorhanden ist. Sie können einen try-catch-Block verwenden und verifizieren.

+0

Sie würden wahrscheinlich "System .__ ComObject" als der Typ, wenn Sie nicht die Interop installiert haben. Es wurde eine Ausnahme ausgelöst. –

+0

Ja, dafür ist der Check gedacht. – danish

+0

Entschuldigung, in meinem Kommentar fehlte ein 'Nein'. Es sollte lauten "Es gibt ** keine ** Ausnahme geworfen." –

0

Sie sollten keinen statischen Verweis auf Excel.Interop-Bibliothek vornehmen. Stattdessen sollten Sie in GAC suchen und es in Runtime laden. Es ist ziemlich kompliziert und es gibt keine verwaltete API (standardmäßig).

Versuchen Sie, diese zu nutzen: fusion.dll API wrapper

1

ich diesen Baustein verwendet haben die x86/x64-Versionen von hunspell im Mai NHunspell Wrapper zu laden. vielleicht ist es ein guter Ausgangspunkt für eigene dynamische Lader:

  // Initialze the dynamic marshall Infrastructure to call the 32Bit (x86) or the 64Bit (x64) Dll respectively 
      SYSTEM_INFO info = new SYSTEM_INFO(); 
      GetSystemInfo(ref info); 

      // Load the correct DLL according to the processor architecture 
      switch(info.wProcessorArchitecture) 
      { 
       case PROCESSOR_ARCHITECTURE.Intel: 
        string pathx86 = AppDomain.CurrentDomain.BaseDirectory; 
        if (!pathx86.EndsWith("\\")) 
         pathx86 += "\\"; 
        pathx86 += Resources.HunspellX86DllName; 

        dllHandle = LoadLibrary(pathx86); 
        if (dllHandle == IntPtr.Zero) 
         throw new DllNotFoundException(string.Format(Resources.HunspellX86DllNotFoundMessage, pathx86)); 
        break; 

       case PROCESSOR_ARCHITECTURE.Amd64: 
        string pathx64 = AppDomain.CurrentDomain.BaseDirectory; 
        if (!pathx64.EndsWith("\\")) 
         pathx64 += "\\"; 
        pathx64 += Resources.HunspellX64DllName; 

        dllHandle = LoadLibrary(pathx64); 
        if (dllHandle == IntPtr.Zero) 
         throw new DllNotFoundException(string.Format(Resources.HunspellX64DllNotFoundMessage, pathx64)); 
        break; 

Blick auf diese Delegierten Erklärungen:

internal delegate bool HunspellSpellDelegate(IntPtr handle, [MarshalAs(UnmanagedType.LPWStr)] string word); 

Und wie eine Bibliotheksfunktion zu binden, um es

HunspellSpell = (HunspellSpellDelegate)GetDelegate("HunspellSpell", typeof(HunspellSpellDelegate)); 

I denke, das sollte auch für dich funktionieren, aber du musst den kompletten Interop-Code deklarieren. Sie können die NHunspell Code überprüfen, eine Arbeitsprobe dieser Technik zu erhalten:

NHunspell Web Site

Verwandte Themen