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

Tri*_*ian 9 security pinvoke .net-4.0

我有一些代码本地win32.自从我升级到.NET 4以来,代码开始抛出一个MethodAccessException:

通过安全透明方法'Tek.Audio.Midi.MidiDevice.GetDevices()'尝试通过方法'Tek.Native.Windows.Multimedia.midiInGetNumDevs()'调用本机代码失败.对于调用本机代码,方法必须是安全关键或安全性安全关键.

这是发生了什么:

  • 可执行程序集的Program.Main方法调用library1 public staticTek.Audio.Midi.MidiDevice.GetDevices()
  • Library1 GetDevices()调用library2的公共静态pinvoke Tek.Native.Windows.Multimedia.midiInGetNumDevs()(是的,不好的做法,无论如何)

涉及的类,方法和程序集上唯一与安全相关的属性是library1上的AllowPartiallyTrustedCallers,我甚至不知道原因.

令我感到羞耻的是,我承认我对.NET的安全性一无所知.我该怎么做才能防止这种异常?虽然我在这里,有什么好文章可以让我开始使用.NET安全性吗?

Nic*_*els 16

你有选择.最简单的方法是"选择退出"新的安全模型.

<configuration>
  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true" />
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

编辑:选择退出.Net 4安全模型是不可靠的,应该避免

你可以标记你的方法:

[SecuritySafeCritical]
Run Code Online (Sandbox Code Playgroud)

因为您可以将其与为部分信任的呼叫者设计的代码一起使用.

可悲的是,我没有一篇好文章可以寄给你,我必须通过修复破碎的代码来解决这个问题.:)