Исключение CodeAccessSecurityEngine - PullRequest
2 голосов
/ 09 августа 2011

Два моих пользователя (из нескольких тысяч) столкнулись со странным исключением при запуске моего приложения. Мне не удалось найти какую-либо полезную информацию об этом через Google, MSDN или Reflector.

enter image description here

Если вы хотите скопировать и вставить этот материал, вот что выписано:

External component has thrown an exception.

Stack trace:
  at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
  at System.Security.SecurityRuntime.Assert(PermissionSet permSet, StackCrawlMark& stackMark)
  at System.Security.PermissionSet.Assert()
  at System.Windows.Forms.WindowsFormsSynchronizationContext.InstallIfNeeded()
  at System.Winfows.Forms.Control..ctor(Boolean autoInstallSyncContext)
  .....
  at GrasshopperPlugin.GrasshopperPlugin.OnLoadPlugIn() //This is the first call to my assembly.
  at RhDN_NativePlugInBase<CRhinoUtilityPlugIn,RMA::Rhino::MRhinoUtilityPlugIn>.OnLoadPlugIn() //This is the C++/CLI mixed mode SDK that loads my .NET assembly.

Что это значит? Почему это происходит? Как я могу это исправить / обнаружить?

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Просто несколько подсказок, это не кристалл из стековой трассировки.Код, который терпит неудачу, живет внутри CLR и написан на C ++, поэтому вы получаете несовершенную трассировку стека.Первое, что нужно сделать, это взглянуть на окно «Вывод», вероятно, вы видите уведомление об исключении «первый шанс».Возможно для 0xc0000005, исключение нарушения прав доступа.Затем вы можете получить больше информации, включив отладку неуправляемого кода (Project + Properties, вкладка Debug), включив сервер символов Microsoft (Tools + Options, Debugging), а затем отметив флажки Thrown в Debug + Exceptions, чтобы отладчик остановился нанеуправляемое исключение.Там не будет никакого кода для просмотра, но трассировка стека может выявить подсказку.

Если это не удастся, это поможет понять, что происходит не так.Код, который терпит неудачу, обходит стек, ища кадры стека, чтобы убедиться, что код, который вызывает метод, имеет надлежащие права доступа.Этот код может потерпеть неудачу, когда стек поврежден.Это очень редко, управляемый код не портит стек.Проблема в том, что не весь ваш код управляется.То, что торчит, это RhDN_NativePlugInBase <>. OnLoadPlugIn ().Написано на C ++ / CLI, так что есть много шансов для чего-то вроде переполнения буфера стека.Может быть что-то глупое, как путь к плагину, который слишком длинный, более 259 символов.Код C ++ часто сходит с ума по этому поводу.

Еще один очень сильный намек на то, что эта функция портит стек, - это сама трассировка стека.Останавливается слишком рано, не показывая, кто вызвал OnLoadPlugin.Это почти наверняка нарушитель спокойствия.Исправлять это будет неприятно, вам понадобится исходный код этой библиотеки и отладка кода C ++ / CLI.Отказ от библиотеки, возможно, должен быть на первом месте в вашем списке.

2 голосов
/ 15 августа 2011

Я использовал ILSpy, чтобы проверить код для WindowsFormsSynchronizationContext.InstallIfNeeded.

Добавляет следующий набор разрешений:

new PermissionSet(PermissionState.Unrestricted).Assert();

А затем вызвать

AsyncOperationManager.SynchronizationContext = new WindowsFormsSynchronizationContext();

, который имеет следующий атрибут в установщике:

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]

Если я правильно понимаю модель безопасности, вы должны убедиться, что пользователям разрешено работать в режиме «FullTrust».

...