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

C# 将COM对象添加到托管代码,c#,c++,.net,com,C#,C++,.net,Com,我有一个头文件,COM接口。我已经创建了一个可以工作的win32小程序,但我的主程序是用C编写的 所以我想在我的主程序中导入这个COM对象,但是当我得到的只有头文件时,我该怎么做呢 我找过的所有地方都需要tlb文件 我是COM对象的新手,所以只需询问您是否需要一些额外信息,或者是否有其他解决方法: [更新] 首先感谢所有的回复! 我尝试了一些不同的方法,但还没有解决我的问题。在我的研究中,我发现了一篇描述COM互操作的文章 这对我没有帮助。但我发现,如果我能完成以下内容,我应该能够开始行动: 声

我有一个头文件,COM接口。我已经创建了一个可以工作的win32小程序,但我的主程序是用C编写的

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

我找过的所有地方都需要tlb文件

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

[更新] 首先感谢所有的回复! 我尝试了一些不同的方法,但还没有解决我的问题。在我的研究中,我发现了一篇描述COM互操作的文章

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

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

[Guid("AD87369B-3BBA-4f1c-81C5-B92FCEA9A1F4"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
interface ICamera
{
    //static HRESULT GetCameraInterface();
    bool StartPreview();
    bool StopPreview();
}
使用强制转换而不是查询接口: 试一试 { CCamera cam=新的CCamera; ICamera试验=ICameracam; //test.StartPreview; } 捕获异常e { Console.WriteLinee.StackTrace; }

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

static  HRESULT GetCameraInterface(void __RPC_FAR *__RPC_FAR *ppvObject);
[解决方案] 好的,我得到了一个解决方案,但我从未解决过包装接口的问题。
相反,我创建了一个C++ DLL项目,并公开了我需要的方法。然后在我的C项目中,我可以将这些方法用于DllImport。如果有人需要更多关于我是如何存档的解释,请给我发一条消息

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

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

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

regasm COMDll.DLL /tlb

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

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

regasm COMDll.DLL /tlb

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

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


我没有尝试过,如果头文件包含的不仅仅是COM定义,您可能会遇到一些困难,祝您好运,请告诉我它是如何运行的。

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


我没有尝试过,如果头文件包含的不仅仅是COM定义,您可能会遇到一些困难,祝您好运,请告诉我它是如何运行的。

是的,我可以阅读,但我正在开发windows CE,我想它只在那里注册了??请注意,我在深水区。你有com对象的Dll吗?如果是这样的话,也许你可以运行regsvr32.exe YourComLibrary.dll来注册它。据我所知,你不能那么容易地从头文件创建TLB。您是否已向COM对象的提供程序请求TLB文件?也许他们能帮上忙。是的,我可以阅读,但我正在开发windows CE,我想它只是在那里注册的??请注意,我在深水区。你有com对象的Dll吗?如果是这样的话,也许你可以运行regsvr32.exe YourComLibrary.dll来注册它。据我所知,你不能那么容易地从头文件创建TLB。您是否已向COM对象的提供程序请求TLB文件?也许他们能帮上忙。