Исключение безопасности метода .NET 4 при пинвокинге - PullRequest
9 голосов
/ 15 июля 2010

У меня есть код, который определяет родной win32.После обновления до .NET 4 код начал выдавать исключение MethodAccessException:

Попытка безопасности прозрачным методом Tek.Audio.Midi.MidiDevice.GetDevices () для вызова собственного кода через метод.Tek.Native.Windows.Multimedia.midiInGetNumDevs () 'не удалось.Методы должны быть критически важными или безопасными для вызова собственного кода.

Вот что происходит:

  • Метод Program.Main исполняемой сборки вызывает библиотеку public1 public static Tek.Audio.Midi.MidiDevice.GetDevices()
  • Library1 GetDevices() вызывает public2 static static pinvoke Tek.Native.Windows.Multimedia.midiInGetNumDevs() (да, плохая практика, что угодно)

Единственными связанными с безопасностью атрибутами для классов, методов и сборок являются:AllowPartiallyTrustedCallers для library1, и я даже не знаю почему.

Мне стыдно признать, что я совершенно не осведомлен о безопасности в .NET.Что я должен сделать, чтобы предотвратить это исключение?И пока я здесь, есть какие-нибудь хорошие статьи, которые помогут мне начать работу по безопасности .NET?

1 Ответ

16 голосов
/ 15 июля 2010

У вас есть выбор. Проще всего было бы «отказаться» от новой модели безопасности.

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

ИЛИ (учитывая, что я не эксперт по безопасности .Net 4)

Редактировать: Отказ от модели безопасности .Net 4 ненадежен и его следует избегать

Вы можете отметить свой метод:

[SecuritySafeCritical]

, поскольку вы можете использовать это с кодом, предназначенным для частично доверенных абонентов.

К сожалению, у меня нет хорошей статьи, которую я могу отправить вам, мне пришлось выяснить это, как вы, исправив мой неработающий код. :)

...