我有一个 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 并运行它,就不会出现这样的初始延迟。
知道这是为什么以及如何解决这个问题吗?
只有 (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)。