'No overload for method...' 通过 CodeDom 使用 interop.excel 方法时出错
'No overload for method...' error when using interop.excel method via CodeDom
我已经引用了库 Microsoft.Office.Interop.Excel
使用下面的简单代码,我可以打开工作簿和 select 第一个工作表:
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = app.Workbooks.Open(fileName, false);
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
ws.Select();
//do stuff with worksheet
wb.Close(false);
app.Quit();
这按预期运行,没有错误。但是,如果我使上面的代码动态化并使用 CodeDom.Compiler 编译上面的代码片段,那么 select 方法会发生错误:
"No overload for method 'Select' takes '0' arguments"
我可以通过稍微更改 select 指令来解决这个问题:
ws.Select(Missing.Value)
但是我不太明白为什么要为此做这个?
我已经将这些引用添加到动态代码中:
using System;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.Office.Interop.Excel;
并设置了 CodeDom 编译器:
CompilerParameters compilerParams = new CompilerParameters();
compilerParams.GenerateInMemory = true;
compilerParams.GenerateExecutable = false;
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
compilerParams.ReferencedAssemblies.Add(@"J:\Visual Studio 2015\Projects\TestProgram\packages\Microsoft.Office.Interop.Excel.15.0.4795.1000\lib\net20\Microsoft.Office.Interop.Excel.dll");
但是请问我还缺少其他设置吗?
我现在有这个工作...
Damien - 你让我开始思考,我进一步研究了 CodeDom 提供程序文档。我找不到有关版本的任何信息,但注意到 Microsoft 设置提供程序的方法与我通常在其他人看到的示例略有不同。
这是之前设置提供商的方式:
Dictionary<string, string> providerOptions = new Dictionary<string, string>
{
{"CompilerVersion", "v3.5"}
};
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
的示例中就是这样设置的
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
这个简单的更改使代码可以无错误地编译并且似乎使用相同版本的 c#。
我已经引用了库 Microsoft.Office.Interop.Excel
使用下面的简单代码,我可以打开工作簿和 select 第一个工作表:
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = app.Workbooks.Open(fileName, false);
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
ws.Select();
//do stuff with worksheet
wb.Close(false);
app.Quit();
这按预期运行,没有错误。但是,如果我使上面的代码动态化并使用 CodeDom.Compiler 编译上面的代码片段,那么 select 方法会发生错误:
"No overload for method 'Select' takes '0' arguments"
我可以通过稍微更改 select 指令来解决这个问题:
ws.Select(Missing.Value)
但是我不太明白为什么要为此做这个?
我已经将这些引用添加到动态代码中:
using System;
using System.Windows.Forms;
using System.Reflection;
using Microsoft.Office.Interop.Excel;
并设置了 CodeDom 编译器:
CompilerParameters compilerParams = new CompilerParameters();
compilerParams.GenerateInMemory = true;
compilerParams.GenerateExecutable = false;
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
compilerParams.ReferencedAssemblies.Add(@"J:\Visual Studio 2015\Projects\TestProgram\packages\Microsoft.Office.Interop.Excel.15.0.4795.1000\lib\net20\Microsoft.Office.Interop.Excel.dll");
但是请问我还缺少其他设置吗?
我现在有这个工作...
Damien - 你让我开始思考,我进一步研究了 CodeDom 提供程序文档。我找不到有关版本的任何信息,但注意到 Microsoft 设置提供程序的方法与我通常在其他人看到的示例略有不同。
这是之前设置提供商的方式:
Dictionary<string, string> providerOptions = new Dictionary<string, string>
{
{"CompilerVersion", "v3.5"}
};
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
的示例中就是这样设置的
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
这个简单的更改使代码可以无错误地编译并且似乎使用相同版本的 c#。