C# 中的 CoCreateInstance()

CoCreateInstance() in C#

我正在将一段代码从 C++ 转换为 C#,但不确定如何使用 CoCreateInstance()。这是 c++(这有效并且是我在 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 是用 c++ 制作的 .dll 中的接口。我在我的 C# 代码中引用了它。基本上我需要这段代码,因为除非我初始化我的设备,否则我不能调用界面中的任何函数。 CoCreateInstance 在我的 C++ 代码中这样做。我发布的代码没有 运行 因为它不能将 Device 用作对象。我注意到在 C++ 代码中 Device 是一个指针,这可能是要在这里实现的东西。我只是不确定。

更新:我使用 CoCreateInstance exact match in .NET? 编写我的代码,但他不使用接口、指针或重新解释转换

  • 某些语言(编译语言或脚本语言)如 Visual Basic 6.0、VBA、VBScript、JScript 具有 隐藏 COM 对象激活细节的运行时.他们还检查 HRESULTS 并将其转换为异常。他们还管理自动调用 AddRef、Release 的生命周期。

如果你在这个COM项目的IDL文件中将参数的[out]属性更改为[out, retval]并重新构建,那么你可以测试以下(我的第一个C#)代码:

using System;

using COMStructProviderLib;

namespace CSharpCOMClient
{
    class Program
    {
        static void Main(string[] args)
        {
            IMyStruct mystruct = new MyStruct();
            mystruct.setName("John");
            String name = mystruct.getName();
            Console.WriteLine(name);
            mystruct.setAge(5);
            long age = mystruct.getAge();
            Console.WriteLine(age);
        }
    }
}

请注意new之后是MyStruct - 不是IMyStruct。 MyStruct 是 idl 文件中指示的名称(在我的示例中,"coclass MyStruct" 不仅可以通过前缀 I 来区分)还需要将对已注册 COM 服务器的引用添加到 C# 项目 (COMStructProviderLib)。同样通过上面提到的 link 你可以得到相应的 C++ COM 客户端,并与这里提供的 C# 客户端进行比较。请注意 C++ 客户端中的注释 - CoCreateInstance 是隐藏的 - 它在智能指针初始化内部调用。