代码之家  ›  专栏  ›  技术社区  ›  Trillian

.NET 4 Pinvoking时的方法安全异常

  •  8
  • Trillian  · 技术社区  · 16 年前

    我有一些pinvokes原生win32的代码。自从我升级到.NET 4之后,代码开始抛出一个methodAccessException,它说:

    安全透明方法“tek.audio.midi.mididevice.getdevices()”尝试通过方法“tek.native.windows.multimedia.midiingetnumdevs()”调用本机代码失败。方法必须是安全关键的或安全关键的,才能调用本机代码。

    下面是发生的事情:

    • 可执行程序集 Program.Main 方法调用库1 public static Tek.Audio.Midi.MidiDevice.GetDevices()
    • 图书馆1号 GetDevices() 调用library2的公共静态pinvoke Tek.Native.Windows.Multimedia.midiInGetNumDevs() (是的,不好的做法,不管怎样)

    涉及到的类、方法和程序集上唯一与安全相关的属性是library1上的allowPartyTrustedCallers,我甚至不知道为什么。

    承认自己对.NET中的安全性一无所知让我感到羞愧。我该怎么做才能防止这个例外呢?当我在这里的时候,有什么好文章可以让我开始了解.NET安全性吗?

    1 回复  |  直到 12 年前
        1
  •  15
  •   Nick Daniels    12 年前

    你有选择。最简单的事情就是“选择退出”新的安全模型。

    <configuration>
      <runtime>
        <NetFx40_LegacySecurityPolicy enabled="true" />
      </runtime>
    </configuration>
    

    或者(记住我不是.NET 4安全专家)

    编辑: 退出.NET 4安全模式不可靠,应避免

    您可以标记您的方法:

    [SecuritySafeCritical]
    

    因为您可以将它与为部分受信任的调用程序设计的代码一起使用。

    不幸的是,我没有一篇好文章可以寄给你,我不得不像你一样,通过修复我的坏代码来解决这个问题。:)