Я конвертирую кусок кода из C++ в C#, но не уверен, как использовать CoCreateInstance(). Вот с ++ (это работает, и это то, что я хочу в C#):CoCreateInstance() в C#
IComDevice *Device=NULL;
HRESULT hr = CoCreateInstance(
__uuidof(ComDevice),
NULL,
1,
IID_IComDevice,
reinterpret_cast<void **>(&Device)
);
и вот что я думал, что будет работать в C#
public class Ole32Methods
{
[DllImport("ole32.Dll")]
static public extern uint CoCreateInstance(ref Guid clsid, [MarshalAs(UnmanagedType.IUnknown)] object inner, uint context, ref Guid uuid, [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);
}
, а затем в главном
IComDevice Device;
uint duh = 1;
Guid uuid=typeof(ComDevice).GUID;
Guid uuid2 = typeof(IComDevice).GUID;
Ole32Methods.CoCreateInstance(ref uuid, null, duh, ref uuid2, out Device);
IComDevice - это интерфейс в .dll, выполненный в C++. Я ссылаюсь на него в своем коде на C#. В принципе мне нужен этот код, потому что я не могу вызывать какие-либо функции в интерфейсе, если я не инициализирую свое устройство. CoCreateInstance делал это в моем коде на C++. Код, который я опубликовал, не запускается, потому что он не может использовать устройство как объект. Я заметил, что в коде C++ Device является указателем, который может быть реализован здесь. Я просто не уверен.
UPDATE: Я использовал CoCreateInstance exact match in .NET? написать свой код, но его не использует интерфейс, указатели, или reinterpretcast
Поскольку в связанном вопросе Саймон очень хорошо просит .NET загрузить COM-объект, а .NET загружает его, скрывая всю уродливую сложность. Вы узнаете, что такое 'IID_IComDevice', и поместите его в' [Guid()] ', а затем надейтесь :-) – xanatos
Просто используйте' Device = new IComDevice() 'в программе на C#. –
@HansPassant Невозможно создать экземпляр абстрактного класса или интерфейса IComDevice() –