C# 使用C++;C语言中的动态链接库# 我试图从C++应用程序中消耗一个用C++编写的DLL。我有第三方的源代码,为C++ DLL(旋风物理引擎),不想手动将它移植到C。 < C++项目> > BR> 我将其更改为输出一个dll。我将其更改为使用/clr标志。我将它改为使用多线程调试DLL(/MDd),因为它是唯一一个与/clr兼容并已编译的DLL

C# 使用C++;C语言中的动态链接库# 我试图从C++应用程序中消耗一个用C++编写的DLL。我有第三方的源代码,为C++ DLL(旋风物理引擎),不想手动将它移植到C。 < C++项目> > BR> 我将其更改为输出一个dll。我将其更改为使用/clr标志。我将它改为使用多线程调试DLL(/MDd),因为它是唯一一个与/clr兼容并已编译的DLL,c#,c++,dll,C#,C++,Dll,在C#项目中 我添加了对dll的引用。我正在使用cyclone名称空间 起初,名称空间下完全没有任何内容。我认为这是因为C++代码中,所有类都声明为没有访问修饰符,默认为私有。因此,对于“粒子”类,我将定义更改为: public class Particle { //... } 现在我可以成功地从C代码中声明Particle类型的变量。但是,intellesense和对象浏览器将粒子报告为结构(?),并且它根本不包含任何方法。C++代码在“公共的”访问修饰符之后声明了一堆方法,所以我不知道问题

在C#项目中
我添加了对dll的引用。我正在使用cyclone名称空间

起初,名称空间下完全没有任何内容。我认为这是因为C++代码中,所有类都声明为没有访问修饰符,默认为私有。因此,对于“粒子”类,我将定义更改为:

public class Particle
{
//...
}
现在我可以成功地从C代码中声明Particle类型的变量。但是,intellesense和对象浏览器将粒子报告为结构(?),并且它根本不包含任何方法。C++代码在“公共的”访问修饰符之后声明了一堆方法,所以我不知道问题是什么。 比如说,

public:
void integrate(real duration);

<>我做了什么错误?< /p> 尝试用REF关键字声明C++类:

public ref class Particle

尝试用REF关键字声明C++类:

public ref class Particle

<>你有没有引用COM互操作?< /P> < P>你有没有引用COM互操作?

< P>我以前没有真正地遇到过你的问题,但是我以前在C++中使用过C++ DLL。通常在这样调用dll时,您会使用关键字。基本上,您可以定义一个类,该类从C++ DLL中导入所有类型和方法。然后可以调用这些包装器类

我远非这方面的专家,但我已经用它来访问win32方法和一些我需要使用的其他库

codeplex上的link有一些链接工具可能会有所帮助。但最重要的可能是互操作助手。它可以为C++的DLL生成C语言包装。
<>这不是你要问的,但是我认为看一个不同的方向可能会有帮助。

< P>我以前没有真正地遇到过你的问题,但是我以前在C++中使用过C++ DLL。通常在这样调用dll时,您会使用关键字。基本上,您可以定义一个类,该类从C++ DLL中导入所有类型和方法。然后可以调用这些包装器类

我远非这方面的专家,但我已经用它来访问win32方法和一些我需要使用的其他库

codeplex上的link有一些链接工具可能会有所帮助。但最重要的可能是互操作助手。它可以为C++的DLL生成C语言包装。
这并不完全是您要问的,但我认为从另一个角度来看可能会有所帮助。

粒子类不是托管类,因此它被视为结构。您需要使用ref关键字来管理它并对其进行垃圾收集。您还需要对引用它的每个其他类执行相同的操作,这可能是一个问题。我认为最好的解决方案是创建一个在内部使用Particle类的托管包装器类。这个包装类可以被.net引用


请参见:

粒子类不是托管类,因此它被视为结构。您需要使用ref关键字来管理它并对其进行垃圾收集。您还需要对引用它的每个其他类执行相同的操作,这可能是一个问题。我认为最好的解决方案是创建一个在内部使用Particle类的托管包装器类。这个包装类可以被.net引用


请参阅:

我认为当您指定/clr标志时,它可以很好地与.NET应用程序配合使用,并且您不需要使用Interop。至少这是我在研究if时收集到的。但我想回答你的问题:我不认为我问的原因是,我使用的大多数C++ DLL都使用了COM接口。我想当你指定/CLR标志时,它与.NET应用程序很好地玩了,你不需要使用互操作。至少这是我在研究if时收集到的。但是回答你的问题:我不认为我问的原因是,我使用的大多数C++ DLL,我使用了COM接口。245编译错误时,我添加一个小关键字到粒子类…也许除非是专门为clr编写的,否则不可能使用clr选项?我知道这个代码是作为纯C++库编写的,没有任何思想。NET中的某些东西,我会创建一个封装粒子粒子类的包装器“SpulyBe大桥”类。让原始代码保持原样,以便它能够成功编译,并且在新的ParticleBridge中有一个粒子实例的私有成员,这样在ParticleBridge上调用的函数将依次调用该粒子的函数。当我将一个小关键字添加到粒子类时,您需要阅读一些关于如何处理C++/CLI.245编译错误中的托管类型和指针的内容。。。也许除非是专门为clr编写的,否则不可能使用clr选项?我知道这个代码是作为纯C++库编写的,没有任何思想。NET中的某些东西,我会创建一个封装粒子粒子类的包装器“SpulyBe大桥”类。让原始代码保持原样,以便它能够成功编译,并且在新的ParticleBridge中有一个粒子实例的私有成员,这样在ParticleBridge上调用的函数将依次调用该粒子的函数。您需要阅读一些关于如何从C++/CLI处理托管类型和指针的知识。我从未听说过这个工具,这应该会有很大帮助。我有点希望\clr标志是魔法…:-/我从没听说过这个工具,它应该会很有用。我有点希望\clr标志是魔法…:-/谢谢,保持C和C++的区别对我来说很难。P/S会调用吗