CompilerParameters.ReferencedAssemblies - 添加互操作程序集 (Microsoft.Office.Interop.Excel.dll)
CompilerParameters.ReferencedAssemblies - Adding interop assemblies (Microsoft.Office.Interop.Excel.dll)
我正在创建一个自动创建 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
上面的代码不起作用,returns 找不到文件 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时引用?
尝试在您的导入中使用它
"Imports Excel = Microsoft.Office.Interop.Excel",我在 excel 文档创建中以这种方式使用它。
嗯,如何最好地解释这个...
.NET Framework 通过 (P)IAs =(主要 - 由软件制造商优化)互操作程序集与 COM Office 应用程序交互。这些 "translate" 介于 COM *.tlbs 和 .NET 语言之间。
从 2003 版开始,Microsoft 随 Office 分发了 PIA;从 2007 版开始,这些将自动安装。它们被安装到 Windows GAC(全局程序集缓存)中。所有适用于 PIA 的代码都应该适用于 GAC 中的内容。
可以从 "Add References" 中的 COM 选项卡中获取对 PIA 的引用,这些引用将始终 引用 GAC。由于许多开发人员对必须从 COM 选项卡添加引用感到困惑,Visual Studio 开始分发一组带有 VS 的 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?, and especially (Physical)(Installed) path of DLL installed to the GAC
如果这仍然是一个问题,您可以使用 tlbImp.exe 生成一组 IA,然后将它们与您的解决方案一起分发。然后你就会有一个具体的路径可以参考
我正在创建一个自动创建 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
上面的代码不起作用,returns 找不到文件 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时引用?
尝试在您的导入中使用它 "Imports Excel = Microsoft.Office.Interop.Excel",我在 excel 文档创建中以这种方式使用它。
嗯,如何最好地解释这个...
.NET Framework 通过 (P)IAs =(主要 - 由软件制造商优化)互操作程序集与 COM Office 应用程序交互。这些 "translate" 介于 COM *.tlbs 和 .NET 语言之间。
从 2003 版开始,Microsoft 随 Office 分发了 PIA;从 2007 版开始,这些将自动安装。它们被安装到 Windows GAC(全局程序集缓存)中。所有适用于 PIA 的代码都应该适用于 GAC 中的内容。
可以从 "Add References" 中的 COM 选项卡中获取对 PIA 的引用,这些引用将始终 引用 GAC。由于许多开发人员对必须从 COM 选项卡添加引用感到困惑,Visual Studio 开始分发一组带有 VS 的 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?, and especially (Physical)(Installed) path of DLL installed to the GAC
如果这仍然是一个问题,您可以使用 tlbImp.exe 生成一组 IA,然后将它们与您的解决方案一起分发。然后你就会有一个具体的路径可以参考