'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);

微软在 https://docs.microsoft.com/en-us/dotnet/api/microsoft.csharp.csharpcodeprovider?view=netframework-4.7

的示例中就是这样设置的
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

这个简单的更改使代码可以无错误地编译并且似乎使用相同版本的 c#。