.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

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