【问题标题】:CompilerParameters.ReferencedAssemblies - Adding interop assemblies (Microsoft.Office.Interop.Excel.dll)CompilerParameters.ReferencedAssemblies - 添加互操作程序集 (Microsoft.Office.Interop.Excel.dll)
【发布时间】:2016-04-29 09:32:45
【问题描述】:

我正在创建一个自动创建 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 时引用?

【问题讨论】:

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


    【解决方案1】:

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

    .NET 框架通过 (P)IAs =(主要 - 由软件制造商优化)互操作程序集与 COM Office 应用程序交互。这些在 COM *.tlbs 和 .NET 语言之间“转换”。

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

    可以从“添加引用”中的 COM 选项卡中获取对 PIA 的引用,这些将始终引用 GAC。由于许多开发人员对必须从 COM 选项卡添加引用感到困惑,因此 Visual Studio 开始分发一组带有 VS 的 PIA,这些 PIA 出现在 .NET 选项卡上。这些是特定于版本的(发布该版本 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 生成一组 IA,并将它们与您的解决方案一起分发。然后,您将有一个可以参考的特定路径。

    【讨论】:

    • 您的回答解决了我的问题,也感谢您提供具体信息,特别是关于可以在 GAC 和 VS 目录中找到的 IA 的差异。回到我的应用程序,我将仅参考 GAC,并且可能会添加一个搜索 Excel 互操作的方法,因为 GAC 中的路径可能仍然不同,因为它可能在每台客户端电脑上安装了不同版本的 Microsoft Office。跨度>
    【解决方案2】:

    尝试在您的导入中使用它 “Imports Excel = Microsoft.Office.Interop.Excel”,我用这种方式来创建我的 excel 文档。

    【讨论】:

    • 谢谢您的回复先生。但我的意思是,当您将 Microsoft.Office.Interop.Excel.dll 添加为引用的程序集之一时。我必须输入 .dll 的绝对路径(或整个文件路径)才能使其正常工作。如果需要绝对路径来引用互操作程序集,那么我必须为将部署我的应用程序的每台计算机设置程序集的文件路径,因为将为每台客户端 PC 安装不同版本的 Microsoft Office,这将导致不同的路径互操作程序集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多