2016-04-29 5 views
0

Ich erstelle eine Methode, die automatisch eine Excel-Datei erstellt. Das Erscheinungsbild der Excel-Datei (Format) hängt vom angegebenen VB.NET-Skript ab. Jetzt habe ich ein Problem in Bezug auf die Assembly Microsoft.Office.Interop.Excel.dll verweisen. Hier ist mein Beispielcode unten:CompilerParameters.ReferencedAssemblies - Hinzufügen von Interop-Assemblies (Microsoft.Office.Interop.Excel.dll)

Imports System.CodeDom.Compiler 
Imports Microsoft.Office.Interop 

Public Class ExcelScript 

    Public Sub ExecuteExcelScript(VBCode As String, ds As DataSet) 

     Dim provOptions As New Dictionary(Of String, String) 
     provOptions.Add("CompilerVersion", "v4.0") 
     Dim vbProvider As New VBCodeProvider(provOptions) 
     Dim vbParameter As New CompilerParameters 
     Dim compResults As CompilerResults = Nothing 

     VBCode = "Imports System" & vbNewLine & 
     "Imports System.Data" & vbNewLine & 
     "Imports System.Data.SqlClient" & vbNewLine & 
     "Imports Microsoft.Office.Interop" & vbNewLine & 
     "Public Class GenerateExcel" & vbNewLine & 
     "Public Sub GenerateExcelFromScript(ds As DataSet)" & vbNewLine & 
     VBCode & vbNewLine & 
     "End Sub" & vbNewLine & 
     "End Class" 

     vbParameter.ReferencedAssemblies.Add("System.dll") 
     vbParameter.ReferencedAssemblies.Add("System.Data.dll") 
     vbParameter.ReferencedAssemblies.Add("System.Xml.dll") 
     vbParameter.ReferencedAssemblies.Add("Microsoft.Office.Interop.Excel.dll") 
     vbParameter.GenerateExecutable = False 
     vbParameter.GenerateInMemory = True 
     vbParameter.OutputAssembly = "ExcelGenerator" 
     compResults = vbProvider.CompileAssemblyFromSource(vbParameter, VBCode) 

    End Sub 

End Class 

Der obige Code funktioniert nicht und gibt einen Fehler zurück, dass die Datei Microsoft.Office.Interop.Excel.dll nicht gefunden werden kann. Aber es wird funktionieren, wenn ich den absoluten Pfad der DLL wie folgt angeben:

 vbParameter.ReferencedAssemblies.Add("C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Excel.dll") 

Ich kann nicht das eine mit dem absoluten Pfad zu unserer Endbenutzer bereitstellen, da sie unterschiedliche Versionen von Microsoft Office haben könnten installiert und die Lage ihrer Excel-Interop-Assembly könnte auch anders sein. Gibt es eine andere Möglichkeit, diese Assembly zu referenzieren oder den vollständigen Pfad dieser Assembly zu erhalten, auf die bei der Implementierung auf einem anderen PC verwiesen wird?

Antwort

0

Mmmm, wie dies am besten erklären ...

Das .NET Framework interagiert mit den COM-Office-Anwendungen durch (P) iAS = (Primary - optimiert durch den Softwarehersteller) Interopassemblys. Diese "übersetzen" zwischen den COM * .tlbs und der .NET-Sprache.

Ab Version 2003 verteilte Microsoft PIAs mit Office; Ab der Version 2007 werden diese automatisch installiert. Und sie werden in den Windows GAC (Global Assembly Cache) installiert. Der gesamte Code, der mit den PIAs arbeitet, sollte mit dem funktionieren, was in der GAC enthalten ist.

Verweise auf die PIAs können von der COM-Registerkarte unter "Verweise hinzufügen" übernommen werden und diese werden immer beziehen sich auf die GAC. Da viele Entwickler verwirrt waren, indem sie einen Verweis von der Registerkarte COM hinzufügen mussten, begann Visual Studio, eine Reihe von PIAs mit VS zu verteilen, die auf der Registerkarte .NET angezeigt werden. Diese sind versionsspezifisch (die Version von Office, die aktuell war, als diese Version von VS veröffentlicht wurde) und natürlich ist der Pfad statisch (wie Sie sehen), aber die .NET-Anwendung wird automatisch zum GAC neu zugeordnet. Normalerweise wäre das kein Problem.

Es scheint, dass Sie an den GAC Ordner mit

%windir%\assembly - prior to .NET 4.0 
%windir%\Microsoft.NET\assembly - NET 4.0 

See beziehen kann auch Where is the .NET Framework Global Assembly Cache? und besonders (Physical)(Installed) path of DLL installed to the GAC

Wenn dies ein Problem bleibt, können Sie eine Reihe von iAS mit TlbImp.exe erzeugen und verteile diese mit deiner Lösung. Dann haben Sie einen bestimmten Pfad, auf den Sie sich beziehen können.

+0

Ihre Antwort löst mein Problem und ich danke Ihnen auch dafür, dass Sie konkrete Informationen gegeben haben, insbesondere in Bezug auf die Unterschiede von IAs, die in GAC und in den VS-Verzeichnissen gefunden werden können.Zurück zu meiner Anwendung Ich werde nur auf den GAC verweisen und möglicherweise eine Methode hinzufügen, die nach dem Excel-Interop suchen wird, da der Pfad in GAC immer noch anders sein kann, da möglicherweise verschiedene Versionen von Microsoft Office pro Client-PC installiert sind. – cod3n00b

0

Probieren Sie dies in Ihren Importen "Imports Excel = Microsoft.Office.Interop.Excel", Ich habe es auf diese Weise für meine Excel-Erstellung verwendet.

+0

Vielen Dank für Ihre Antwort Sir. Aber was ich meine ist, dass wenn Sie die Microsoft.Office.Interop.Excel.dll als eine der referenzierten Assemblys hinzufügen. Ich muss den absoluten Pfad (oder den gesamten Dateipfad) der .dll setzen, damit es funktioniert. Wenn der absolute Pfad zum Verweis auf die Interop-Assembly benötigt wird, muss ich den Dateipfad der Assembly für jeden Computer festlegen, auf dem meine App implementiert wird, da für jeden Client-PC verschiedene Versionen von Microsoft Office installiert sind, die zu unterschiedlichen Pfaden führen der Interop-Anordnung. – cod3n00b