Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中定义一个接口+;这需要在C和C+中实现+; 我有一个C++接口,现在需要在C语言中实现。最好的办法是什么?我根本不想在接口定义中使用COM。我现在解决的方法是有两个接口定义,一个是C++,一个是C。然后,我将C#接口作为COM服务器公开。这是我用C++编写的应用程序,可以调用C++语言。不管怎样,我可以避免在C++中定义我的实现,也可以避免用C ^?/p>< p>为什么不使用COM?p>_C#_.net_C++_Interop_Interface - Fatal编程技术网

在C+中定义一个接口+;这需要在C和C+中实现+; 我有一个C++接口,现在需要在C语言中实现。最好的办法是什么?我根本不想在接口定义中使用COM。我现在解决的方法是有两个接口定义,一个是C++,一个是C。然后,我将C#接口作为COM服务器公开。这是我用C++编写的应用程序,可以调用C++语言。不管怎样,我可以避免在C++中定义我的实现,也可以避免用C ^?/p>< p>为什么不使用COM?p>

在C+中定义一个接口+;这需要在C和C+中实现+; 我有一个C++接口,现在需要在C语言中实现。最好的办法是什么?我根本不想在接口定义中使用COM。我现在解决的方法是有两个接口定义,一个是C++,一个是C。然后,我将C#接口作为COM服务器公开。这是我用C++编写的应用程序,可以调用C++语言。不管怎样,我可以避免在C++中定义我的实现,也可以避免用C ^?/p>< p>为什么不使用COM?p>,c#,.net,c++,interop,interface,C#,.net,C++,Interop,Interface,这是我的建议。COM互操作对我来说非常有效,我在C#中使用了COM对象和接口(只需引用COM对象,运行时可调用包装器就会自动创建)。同样,将C++类标记为“COM互操作登记”也有相反的作用。< P>如果您愿意使用C++ + CLI作为托管代码而不是C语言,那么您可以直接通过头文件直接使用本机C++接口定义。这有多容易取决于界面中的内容——最简单的情况是可以从C中使用 查看Marcus Heege的文章,了解了.NET中混合本地和托管C++ C++的一些有用信息。P> >在C++中编写接口,使用宏

这是我的建议。COM互操作对我来说非常有效,我在C#中使用了COM对象和接口(只需引用COM对象,运行时可调用包装器就会自动创建)。同样,将C++类标记为“COM互操作登记”也有相反的作用。

< P>如果您愿意使用C++ + CLI作为托管代码而不是C语言,那么您可以直接通过头文件直接使用本机C++接口定义。这有多容易取决于界面中的内容——最简单的情况是可以从C中使用


查看Marcus Heege的文章,了解了.NET中混合本地和托管C++ C++的一些有用信息。P> >在C++中编写接口,使用宏使其看起来像UNIX上的标准CPP头文件,就像Windows上的IDL文件一样。(如果这不起作用,你可以总是写一个Python/Ruby脚本来从C++头文件生成IDL)。


编译IDL以生成typelib。使用typelib导入器生成C#的接口定义并在那里实现接口。

您没有提到您使用的是哪个版本的.NET,但我在使用Visual Studio.NET 2003时所做的一件事是为real Studio的Pimple实现提供一个薄薄的C#包装器C++类:

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

private:
   MyClass __nogc *native_ptr_;
};
显然,人们更愿意在那里使用Boost shared_ptr,但我无法让他们在V.NET 2003中玩得很好

方法简单地通过指针来转换底层的C++方法。方法参数可能必须转换。例如,调用一个采用字符串的C++方法,C方法可能需要一个String。(String::在托管C++中的字符串)。您必须使用System::运行时::InopServices::StruttoHgLoLalAn():这样做


这种方法的一个优点是因为托管C++是.NET语言,你可以将访问器公开为属性(y-yAtHype)。甚至可以公开属性,非常类似于C语言。

< P>另一种方法是使用“扁平”的C风格API。以防止意外重载。使用DEF文件显式命名导出函数,因此它们绝对不会以任何方式进行修饰(C++函数使用导出表中参数类型的编码进行“修饰”)

在x86上,注意调用约定。它可能是明确声明使用< C++ >代码> >代码> >代码> >代码> >代码>。因为p/INVAKE主要用于调用Windows API,它默认为STDCALL,而C和C++默认为CDECL,因为它支持VARARGS。

我最近在C++的C++接口中封装了COM接口<代码>代码> IrApistRAM/<代码> .NET试图将ItReRAM转换成一个存储,但错误的代码错误> StggEyuununtEngult< /COD>失败了。

< P>是用C语言来封装C++类的一个很好的工具。Nishant Sivakumar是理解C++与C语言连接的重要资源。