2012-02-22 38 views
1

我有一个头文件COM接口。我创建了一个小型的win32程序,但我的主程序是用C#编写的。将COM对象添加到托管代码

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

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

我是新来的COM对象,所以只是问,如果你需要一些额外的信息,或者有其他的解决办法:)

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

这并没有帮助我。但我发现,我应该能够得到运动,如果我能完成以下步骤:

  1. 声明一个COM组件类:

    [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:

    尝试 CCamera cam = new CCamera(); ICamera测试=(ICamera)cam; //test.StartPreview(); (例外e) { } Console.WriteLine(e.StackTrace); }

我得到一个无效转换异常,所以这是因为我错过实现在该界面的方法呢? ,如何实现从C++接口下面的方法:

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

[解决方法] OK我有一个解决方案,但我从来没有解决包的接口。 相反,我创建了一个C++ dll项目并公开了我需要的方法。然后在我的C#项目中,我可以使用这些方法与DllImport。如果有人需要更多关于我如何存档的解释,请给我留言。

回答

2

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

+0

是的,它是我可以读,但我发展到Windows CE,我认为这只是那里注册?请忍受我在这里深水。 – DNRN 2012-02-22 15:39:16

+0

你有COM对象的DLL的?如果是这样,也许你可以运行“Regsvr32.exe的YourComLibrary.dll”进行注册。 – Botz3000 2012-02-22 15:42:40

+0

我没有DLL :( – DNRN 2012-02-22 15:49:07

1

你需要下面一行

regasm COMDll.DLL /tlb 

注册COM DLL,那么你可以将其添加为您的项目的引用。

1

我已经完成了一些研究,发现可以包括在多你使用C做相同的方法,IDL文件头文件,下面是两个链接,告诉你如何包含在IDL的头文件和编译IDL的TBL文件,你可以在.NET中使用:

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定义,所以祝你好运,请让我知道它是怎么回事。