'方法没有过载......'通过CodeDom使用interop.excel方法时出错

时间:2017-10-02 10:25:11

标签: c# excel codedom

我引用了库Microsoft.Office.Interop.Excel

使用以下简单的代码,我可以打开工作簿并选择第一个工作表:

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方法会出错:

  

"方法无过载'选择'需要' 0'参数"

我可以通过稍微改变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");

但是还有其他的东西/其他一些我不知道的设置吗?

1 个答案:

答案 0 :(得分:1)

我现在有这个工作......

达米恩 - 你让我思考,我更多地研究了CodeDom提供者文档。我找不到任何关于版本的内容,但注意到微软设置提供程序的方法与我通常看到的其他示例略有不同。

这就是提供商之前的设置方式:

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#。