38

我有一个类似于以下的(C#)函数。

private static bool SpecialCase = false;

public void Foo()
{
    if (SpecialCase)
    {
        InternalMethod();
        return;
    }

    Console.WriteLine();
}

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void InternalMethod();

当我在调试器中使用 .NET Framework 4 执行此操作时,该方法成功地将空白行打印到控制台并返回。当我在调试器之外执行它时,它会引发异常并显示以下消息:

System.Security.SecurityException: ECall methods must be packaged into a system module.

当 JIT 编译器编译方法而不是InternalMethod调用 (if) 时,似乎会引发异常。有什么我可以做的(例如属性)告诉 CLI 要么不抛出SecurityException,要么延迟异常直到方法被实际调用?

用例的旁注:SpecialCase当使用 Microsoft .NET Framework 运行时,该字段实际上为 false,而在 CLI 的不同(特定)实现下运行时为 true。在 Microsoft .NET Framework 下运行时,调用InternalMethod实际上是无法访问的。

4

2 回答 2

2

您可能希望检查编译器指令作为一个可能的选项。与使用运行时“if”不同,这将确定调用是否包含在编译后的代码中,而不是总是将其编译到代码中并尝试确定是否在运行时调用它(这为时已晚,根据您的分析)。

您的用例似乎是一个测试/验证场景,这意味着您不需要将其编译到代码中,除非实际进行内部调用。

请注意,如果您的用例涉及非 .NET 运行时,则应提供更多信息,因为这可能会极大地改变正确答案。

于 2016-01-28T03:25:15.130 回答
1

将属性添加[ComImport]到您的类声明

于 2015-11-19T00:59:21.973 回答