C# 从C调用旧的OLE组件#

C# 从C调用旧的OLE组件#,c#,dll,ole,typelib,C#,Dll,Ole,Typelib,我有一个非常旧的(VC++5.0)专有DLL,我需要从C#(Visual Studio 2010)使用它。该示例指定,要访问该组件,我需要调用CreateDispatch(“应用程序”),这表示指向OLE 下面是示例代码(C++): 我通过Visual Studio向我拥有的TLB文件添加了一个引用,并且我可以成功导入其命名空间,但是IComponentServer没有任何名为CreateDispatch的方法 通过C#创建OLE组件实例的正确方法是什么?MFC的CreateDispatch基于

我有一个非常旧的(VC++5.0)专有DLL,我需要从C#(Visual Studio 2010)使用它。该示例指定,要访问该组件,我需要调用
CreateDispatch(“应用程序”)
,这表示指向OLE

下面是示例代码(C++):

我通过Visual Studio向我拥有的TLB文件添加了一个引用,并且我可以成功导入其命名空间,但是
IComponentServer
没有任何名为
CreateDispatch
的方法


通过C#创建OLE组件实例的正确方法是什么?

MFC的
CreateDispatch
基于CLSID或ProgId字符串创建COM对象。您可以直接从C#代码实例化COM对象

假设Visual Studio引用为您提供Interop.Component.dll:


如果您有CLSID或ProgID,则可以使用以下方法集

var type = Type.GetTypeFromProgID(progIdString);
var obj = Activator.CreateInstance(type);
var server = (IComponentServer)obj;

可能无法工作,MFC代码正在使用后期绑定的IDispatch接口。除非OP使用4.0版并能利用动态特性,否则在C#中就不那么容易做到。一个用VB.NET编写的小适配器是一个选项。这可能是唯一的选项-根据@JaredPar的回答,类型库看起来不太好。你能解释一下Interop包是从哪里来的吗?在这里有点迷失。@jbx Visual Studio在您添加TLB引用时生成它。您可以导入其名称空间这一事实表明互操作很好。然而,你的无效例外说明TLB本身不可靠。谢谢,现在我明白你所指的了。实际上,您不能(至少在我的例子中)直接实例化ServerClass(它说不能嵌入互操作类型,请使用适用的接口)。但是,接口IComponentServer有一个[CoClass]属性,该属性引用要实例化的COM类。因此,通过一些调整,您的建议应该会起作用。谢谢JaredPar。你知道我为什么会因为你提供的代码而收到InvalidCastException吗?此操作失败,因为对IID为“{BAA135B2-F931-11D0-9C14-0060973155F0}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))。@jbx,最可能的原因是COM程序集的类型库未正确注册。我尝试了regasm,但失败的原因是它不是有效的.Net程序集(正确的原因是,这是VC++5.0时代的旧库)。我尝试了regtlibv12.exe,它说它成功注册了TLB。然而,同样的问题。你知道我能做什么吗?
IComponentServer server = new Interop.Component.ServerClass();
var type = Type.GetTypeFromProgID(progIdString);
var obj = Activator.CreateInstance(type);
var server = (IComponentServer)obj;