c# - 将 COM 对象添加到托管代码

标签 c# c++ .net com

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

所以我想在我的主程序中导入这个 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; //测试.StartPreview(); } 捕获(异常(exception) e) { 控制台.WriteLine(e.StackTrace);

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

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

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

最佳答案

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

关于c# - 将 COM 对象添加到托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9397588/

相关文章:

c# - 使用 ICertAdmin2::RevokeCertificate 方法撤销 C# 中的证书

c# - 显示Windows窗体时,控制台应用程序不接受输入

c++ - std::function 的问题

c# - 使用星号时导致程序集版本增加的原因是什么?

c# - 写入 MySQL

c# - 如何在部分回发时更新 session 值以及如何使 Javascript 使用新值

c# - PropertyInfo.GetValue(myObject, null).GetType() 返回 "Object reference not set to an instance of an object."

c++ - 在 C++ 中从字符串计算算术表达式

c++ - CMake项目 build 的问题

.net - 如何使用Lambda和表达式树在Linq中加入?