.NET аварийно завершает работу, когда собственный код передает NULL в выходной параметр CCWC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 .NET аварийно завершает работу, когда собственный код передает NULL в выходной параметр CCW

Сообщение Anonymous »

У меня есть .NET CCW, реализующий метод интерфейса со следующей сигнатурой

Код: Выделить всё

[PreserveSig]
HRESULT GetKeyValue(
[In, MarshalAs(UnmanagedType.LPWStr)] string key,
[Out, MarshalAs(UnmanagedType.Interface)] out IModelObject @object,
[Out, MarshalAs(UnmanagedType.Interface)] out IKeyStore metadata);
Я передаю свой CCW в сторонний модуль, который не контролирую. Затем он пытается перезвонить моему CCW следующим образом:

Код: Выделить всё

//Decompiled native code of what the third party native module
//is doing when it invokes my CCW
(*(*ccw + 40i64))(ccw, L"ActionName", &object, 0i64); // GetKeyValue
Последнему параметру присвоено значение NULL. Когда CLR пытается маршалировать эти параметры в мой управляемый метод, в IL_STUB_COMtoCLR происходит сбой, поскольку R9 (четвертый параметр) имеет значение NULL. Если я солгу и удалю параметр метаданных IKeyStore из определения метода управляемого интерфейса, сбой не произойдет, что подтверждает, что проблема действительно в этом.
Когда COM-объекты реализованный на C++, это довольно распространенный шаблон - иметь дополнительные параметры, которым вы можете передать NULL, которые COM-объект будет проверять, чтобы определить, нужно ли ему выполнять какую-либо работу для этого параметра, поэтому я не уверен я просто не понимаю, как можно обойти эту проблему, или это действительно недосмотр в конструкции встроенного .NET Marshaller?

Подробнее здесь: https://stackoverflow.com/questions/783 ... -parameter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»