与 VB.net 相比,C# 中从 Excel 到 PowerPoint 的互操作函数调用要慢得多(首次运行时)

问题描述 投票:0回答:1

我有一个 VSTO Excel 插件和一个 VSTO PowerPoint 插件。我使用以下代码从 Excel 插件调用 PowerPoint 插件函数之一:

 Application pptApp = null;
 try
 {
     pptApp = (Application)Marshal.GetActiveObject("Powerpoint.Application");
 }
 catch (Exception)
 {
     return;
 }

if(pptApp is null) return;
     
var addIn = pptApp.COMAddIns.Item(ref argIndex);

if (addIn.Connect)
{
    ((dynamic)addIn.Object).ExternalFunctionCall(); // this is the slow function call
}

这按预期工作,但我第一次调用此函数时需要几秒钟才能执行。进一步的呼叫不会有任何延迟。如果我将上面的代码转换为 VB.net 并运行它,就不会出现这样的初始延迟。

知道这是为什么以及如何解决这个问题吗?

c# .net vb.net office-interop com-interop
1个回答
0
投票

只有 (MS)IL 才能阐明为什么使用 C# 和 VB.NET 会得到不同的结果。您需要比较 C# 和 VB.NET 编译器生成的结果。

托管代码是用可以在 .NET 上运行的高级语言之一编写的,例如 C#、Visual Basic、F# 等。当您使用这些语言各自的编译器编译用这些语言编写的代码时,您不会获得机器代码。您将获得中间语言代码,然后运行时会编译并执行该代码。 C++ 是这一规则的一个例外,因为它还可以生成在 Windows 上运行的本机非托管二进制文件。

什么是“中间语言”(简称IL)?它是用高级.NET 语言编写的代码编译的产物。一旦编译用其中一种语言编写的代码,您将获得由 IL 制成的二进制文件。值得注意的是,IL 独立于运行时之上运行的任何特定语言。甚至还有一个单独的规范,如果您愿意的话可以阅读。

一旦从高级代码生成 IL,您很可能想要运行它。这是 CLR 接管并启动即时编译过程的地方,或者将代码从 IL 即时编译为实际上可以在 CPU 上运行的机器代码。通过这种方式,CLR 确切地知道你的代码在做什么,并且可以有效地管理它。

中间语言有时也称为通用中间语言 (CIL) 或 Microsoft 中间语言 (MSIL)。

© www.soinside.com 2019 - 2024. All rights reserved.