CompilerParameters.ReferencedAssemblies - 添加互操作程序集(Microsoft.Office.Interop.Excel.dll)

时间:2016-04-29 09:32:45

标签: .net vb.net excel office-interop

我正在创建一个自动创建Excel文件的方法。 Excel文件(格式)的外观取决于给定的VB.NET脚本。现在我在引用程序集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

上面的代码不起作用,并返回无法找到文件Microsoft.Office.Interop.Excel.dll的错误。但是,如果我像这样指定dll的绝对路径,它将起作用:

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

我无法将具有绝对路径的那个部署到我们的最终用户,因为他们可能安装了不同版本的Microsoft Office,并且他们的Excel互操作程序集的位置也可能不同。有没有其他方法可以引用此程序集或获取此程序集的完整路径,以便在部署到另一台PC时引用?

2 个答案:

答案 0 :(得分:0)

尝试在导入中使用此功能 " Imports Excel = Microsoft.Office.Interop.Excel",我已经以这种方式使用它来创建我的Excel文档。

答案 1 :(得分:0)

嗯,如何最好地解释这个...

.NET Framework通过(P)IAs =(主要 - 由软件制造商优化)Interop Assemblies与COM Office应用程序交互。这些在COM * .tlbs和.NET语言之间“翻译”。

从2003版本开始,Microsoft通过Office分发PIA;从2007版开始,这些将自动安装。它们安装在Windows GAC(全局程序集缓存)中。所有与PIA一起使用的代码都应该与GAC中的内容一起使用。

可以从“添加引用”中的COM选项卡中选择对PIA的引用,这些总是引用GAC。由于许多开发人员因为必须从COM选项卡添加引用而感到困惑,因此Visual Studio开始在.NET选项卡上分发一组带有VS的PIA。这些是特定于版本的(当VS版本发布时最新的Office版本),当然路径是静态的(如您所见),但.NET应用程序将自动重新映射到GAC,所以通常这不是问题。

您似乎可以使用

参考GAC文件夹位置
%windir%\assembly - prior to .NET 4.0
%windir%\Microsoft.NET\assembly - NET 4.0

另请参阅Where is the .NET Framework Global Assembly Cache?,尤其是(Physical)(Installed) path of DLL installed to the GAC

如果这仍然是一个问题,您可以使用tlbImp.exe生成一组IAs并将其与您的解决方案一起分发。然后,您将拥有一个可以参考的特定路径。

相关问题