将 COM 对象添加到托管代码

Posted

技术标签:

【中文标题】将 COM 对象添加到托管代码【英文标题】:Adding COM object to managed code 【发布时间】:2012-02-22 15:21:04 【问题描述】:

我有一个头文件,即 COM 接口。我创建了一个可以运行的小型 win32 程序,但我的主程序是用 C# 编写的。

所以我想在我的主程序中导入这个 COM 对象,但是当我得到的唯一东西是头文件时,我该怎么做呢?

我看过的所有地方都需要 tlb 文件..?

我是 COM 对象的新手,所以请问您是否需要一些额外的信息,或者有其他解决方法:)

[更新] 首先感谢所有回复! 我尝试了一些不同的东西,但还没有解决我的问题。在我的研究中,我发现了一篇描述 COM 互操作的文章 http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx#vcwlkcominteroppart1cclienttutorialanchor2

这对我没有帮助。但我发现如果我能完成以下任务,我应该能够开始行动:

    声明一个 COM coclass:

    [ComImport, Guid("7C075F7F-FD71-40a2-AC63-0D0C4DB39ECA")]
    class CCamera
    
        // Cannot have any members here 
        // NOTE that the C# compiler will add a default constructor
        // for you (no parameters).
    
    

    创建一个 COM 类包装器:

    [Guid("AD87369B-3BBA-4f1c-81C5-B92FCEA9A1F4"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    interface ICamera
    
        //static HRESULT GetCameraInterface();
        bool StartPreview();
        bool StopPreview();
    
    
      使用强制转换而不是 QueryInterface:

    试试 CCamera cam = new CCamera(); ICamera 测试 = (ICamera)cam; //test.StartPreview(); 捕获(异常 e) Console.WriteLine(e.StackTrace);

我得到一个无效的强制转换异常,这是因为我错过了在接口中实现某些方法吗? 以及如何从 c++ 接口实现以下方法:

static  HRESULT GetCameraInterface(void __RPC_FAR *__RPC_FAR *ppvObject);

[解决方案] 好的,我有一个解决方案,但我从来没有解决过包装界面。 相反,我创建了一个 C++ dll 项目并公开了我需要的方法。然后在我的 C# 项目中,我可以将这些方法与 DllImport 一起使用吗?如果有人需要更多关于我如何存档的解释,请给我发消息。

【问题讨论】:

【参考方案1】:

如果它被注册为 COM-Object,那么您可以通过添加引用对话框将其导入。右键单击项目 --> 添加引用。然后选择选项卡“COM”,您可以选择您的 COM 接口。 .NET 所需的互操作类将自动生成。

【讨论】:

是的,我可以阅读,但我正在开发 Windows CE,我认为它只在那里注册??请忍耐一下,我在深水区。 你有com对象的Dll吗?如果是这样,也许你可以运行“regsvr32.exe YourComLibrary.dll”来注册它。 据我所知,您不能轻易地从头文件创建 TLB。您是否向 COM 对象的提供者询问过 TLB 文件?也许他们可以提供帮助。【参考方案2】:

您需要使用以下行注册 COM dll

regasm COMDll.DLL /tlb

然后您可以将其添加为项目的引用。

【讨论】:

【参考方案3】:

我已经完成了一些研究,发现您可以在 idl 文件中包含头文件,与使用 C 的方式大致相同,下面是两个链接,向您展示如何在 idl 中包含头文件并进行编译将 idl 转换为可以在 .Net 中使用的 tbl 文件:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa367049(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa367064(v=vs.85).aspx

我还没有尝试过,如果头文件包含的不仅仅是 COM 定义,看起来你可能会遇到一些困难,所以祝你好运,请告诉我进展如何。

【讨论】:

以上是关于将 COM 对象添加到托管代码的主要内容,如果未能解决你的问题,请参考以下文章

将 `lastModified` 记录添加到 Core Data 托管对象

如何使用git把代码托管到gitlab上

将代码到托管到git代码库

如何将VARIANT转换为托管对象?

使用 ATL/COM 将托管字节 [] 转换为非托管字节数组

从 .NET 代码中销毁非托管对象