将COM对象添加到托管代码

时间:2012-02-22 15:21:05

标签: c# c++ .net com

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

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

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

我是COM对象的新手,所以只要问你是否需要一些额外的信息,或者有另一种解决方法:)

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

的文章

这对我没有帮助。但我发现,如果我能完成以下任务,我应该能够继续前进:

  1. 声明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).
    }
    
  2. 创建COM类包装器:

    [Guid("AD87369B-3BBA-4f1c-81C5-B92FCEA9A1F4"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    interface ICamera
    {
        //static HRESULT GetCameraInterface();
        bool StartPreview();
        bool StopPreview();
    }
    
    1. 使用Casts而不是QueryInterface:
    2. 试 {     CCamera cam = new CCamera();     ICamera test =(ICamera)cam;     //test.StartPreview(); } catch(例外e) {     Console.WriteLine(e.StackTrace); }

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

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

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

3 个答案:

答案 0 :(得分:2)

如果将其注册为COM对象,则可以通过“添加引用”对话框将其导入。右键单击项目 - >添加参考。然后选择选项卡“COM”,您可以选择您的COM接口。将自动生成.NET所需的Interop类。

答案 1 :(得分:1)

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

regasm COMDll.DLL /tlb

然后您可以将其添加为项目的参考。

答案 2 :(得分:1)

我已经完成了一些研究,发现你可以在idl文件中包含一个头文件,就像你使用C一样,下面是两个链接,向你展示如何在idl中包含头文件并编译idl到你可以在.Net中使用的tbl文件:

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

我还没有尝试过,看起来如果头文件不仅仅包含COM定义,你可能会遇到一些困难,祝你好运,请告诉我它是怎么回事。

相关问题