【发布时间】: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 一起使用吗?如果有人需要更多关于我如何存档的解释,请给我发消息。
【问题讨论】: