当通过CodeDom使用interop.excel方法时,“方法没有超载”错误

我引用了库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(); 

这按预期运行,没有错误。 但是,如果我使上面的代码dynamic并使用CodeDom.Compiler编译上面的代码片段,那么select方法会发生错误:

“方法没有超载”select“0”参数“

我可以通过稍微改变select指令来解决这个问题,如下所示:

 ws.Select(Missing.Value) 

但是我不明白为什么我需要这样做呢?

我已经将这些引用添加到dynamic代码中了:

 using System; using System.Windows.Forms; using System.Reflection; using Microsoft.Office.Interop.Excel; 

并build立了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"); 

但有什么别的/其他一些设置,我错过了吗?

我现在有这个工作…

达米恩 – 你让我思考,我更多地看着CodeDom的提供者文档。 我找不到任何有关版本的内容,但注意到微软build立提供商的方法与我通常见过的例子稍有不同。

这就是提供者之前的设置:

 Dictionary<string, string> providerOptions = new Dictionary<string, string> { {"CompilerVersion", "v3.5"} }; CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); 

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

 CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 

这个简单的改变允许代码无错地编译,看起来使用了相同版本的c#。