2008-09-15 93 views
5

我有一个接口,我在C++中定义了现在需要在C#中实现的接口。什么是最好的方式去做这件事?我不想在我的界面定义中使用COM。我现在解决这个问题的方法是有两个接口定义,一个用C++和一个用C#。然后我将C#接口公开为COM服务器。这是我用C++编写的应用程序可以调用到C#中。无论如何,我可以避免必须在C++和C#中定义我的实现吗?在C++中定义需要用C#和C++实现的接口

回答

3

如果您愿意为您的托管代码而不是C#使用C++/CLI,那么您可以直接通过头文件使用本地C++接口定义。这将是多么容易取决于你的界面到底是什么 - 最简单的情况是你可以从C使用的东西。

看看Marcus Heege的Expert C++/CLI: .NET for Visual C++ Programmers,了解很多关于混合原生和托管C++的有用信息在.NET中。

+0

还想补充一点,Nishant Sivakumar在C++/CLI中的作用是了解如何将C++连接到C#的一个很好的资源。 – Juba 2011-02-04 17:39:03

1

为什么你不想使用COM?

这将是我的建议。 COM interop对我来说工作得非常好,我在C#中使用了COM对象和接口(只需引用COM对象并自动创建运行时可调用的包装器)。反过来,将C#类标记为“注册COM互操作”也是如此。

1

在C++中编写接口并使用宏使其看起来像UNIX上的标准cpp头文件,并且像windows上的IDL文件(如果这样做不起作用,则可以始终编写一个python/ruby​​脚本来生成来自C++头文件的IDL)。

编译IDL以生成一个typelib。使用TypeLib导入器为C#生成接口定义并在其中实现接口。

1

在IDL中编写接口并使用工具将接口编译为目标语言。在查看涉及跨语言接口的CORBA时,您可能会发现这些指针。

/艾伦

0

你没有提到你正在使用.NET,但东西是我在使用Visual Studio .NET 2003的工作的版本是提供各地的小突起实现的薄C#包装真正的C++类:

public __gc class MyClass_Net { 
public: 
    MyClass_Net() 
     :native_ptr_(new MyClass()) 
    { 
    } 
    ~MyClass_Net() 
    { 
     delete native_ptr_; 
    } 

private: 
    MyClass __nogc *native_ptr_; 
}; 

显然,人们会更喜欢使用升压shared_ptr的有,但我从来没有让他们与V.NET 2003发挥很好...

方法简单地转发到底层C++方法通过指针。方法参数可能必须转换。例如,要调用一个接受字符串的C++方法,C#方法可能需要一个System.String(System :: String in Managed C++)。你必须使用System :: Runtime :: InteropServices :: Marshal :: StringToHGlobalAnsi()来做到这一点。

这种方法的一个好处是,因为Managed C++是一种.NET语言,您可以将访问器作为属性(__property)公开。你甚至可以公开属性,就像在C#中一样。

1

另一种方法是使用'扁平',C风格的API。您不妨使用extern "C"来防止意外超载。使用一个DEF文件明确命名导出的函数,所以它们绝对不是以任何方式装饰的(C++函数在导出表中用参数类型的编码进行“装饰”)。

在x86上,请小心调用约定。可能会明确声明使用__stdcall__cdecl。由于P/Invoke主要用于调用Windows API,因此默认为StdCall,但C和C++默认为cdecl,因为它支持可变参数。

我最近将COM接口IRapiStream封装在一个扁平的C接口中,因为.NET似乎试图将IStream转换成存储器,该存储器因错误STG_E_UNIMPLEMENTEDFUNCTION而失败。

2

Swig是用C#等其他语言包装C++类的好工具。