【问题标题】:Can SuppressUnmanagedCodeSecurityAttribute be applied to COM Interop interfaces?可以将 SuppressUnmanagedCodeSecurityAttribute 应用于 COM 互操作接口吗?
【发布时间】:2013-10-15 17:12:56
【问题描述】:

SuppressUnmanagedCodeSecurityAttribute 是否可以应用于 COM Interop 接口以提高性能,还是仅适用于优化本机函数调用? MSDN says:

此属性仅在应用于 PInvoke 方法(或包含 PInvoke 方法的类)或将通过其进行互操作调用的接口定义时有效。它将在所有其他上下文中被忽略。

但是,我不确定这是否包括 COM 互操作。

【问题讨论】:

    标签: c# .net com com-interop


    【解决方案1】:

    或定义互操作调用的接口

    这是关于 COM 接口的。该属性必须应用于接口声明才能生效。请注意这有多难,COM 接口通常在由 Tlbimp.exe 生成的互操作库中声明。缺少自动生成属性的选项。实际上,只有自己声明接口才能做到这一点。

    【讨论】:

    • 每次使用TlbImp,生成的代码都是乱七八糟的类型,所以我不得不自己反编译代码并声明所有类型...顺便说一句,你知道@987654321 @? TlbImp 也会生成它...
    • 只是一个属性告诉jitter该方法的代码在别处,千万不要直接调用该方法。
    • 有没有实质性的影响?加这个属性好不好?
    • 没什么实质性的。没必要。
    • COM Interop 需要“InternalCall”属性才能在 Mono 上运行。如果缺少此属性,Mono JIT 只会崩溃。 (至少在 Linux 上;没有在 Windows 上使用 Mono 进行测试。)
    【解决方案2】:

    根据this MS page,您可以让 Tlbimp.exe 通过传递“/unsafe”开关将 SuppressUnmanagedCodeSecurity 属性应用于您的 COM 接口。我可以通过一个简单的测试 TLB 确认它的工作原理与宣传的一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多