C# 在同一个函数中封送2个IntPtr? 我想知道如何用C语言编排我用C++制作的2个课程。 一个教程链接将是完美的,我试图谷歌这为自己,但我的英语知识不是那么先进,搜索正确的东西。我是一个新的从C++到c的封送处理系统
好的,基本上我有这样的东西: C++ C 现在我的问题是在哪里使用DLL_GiveWheelToCar? 我尝试的方法被注释掉了,因为它不起作用,这是一个逻辑错误还是我应该改变封送的方式 谢谢你的建议C# 在同一个函数中封送2个IntPtr? 我想知道如何用C语言编排我用C++制作的2个课程。 一个教程链接将是完美的,我试图谷歌这为自己,但我的英语知识不是那么先进,搜索正确的东西。我是一个新的从C++到c的封送处理系统,c#,c++,dll,pinvoke,marshalling,C#,C++,Dll,Pinvoke,Marshalling,好的,基本上我有这样的东西: C++ C 现在我的问题是在哪里使用DLL_GiveWheelToCar? 我尝试的方法被注释掉了,因为它不起作用,这是一个逻辑错误还是我应该改变封送的方式 谢谢你的建议 public void GiveWheel(Wheel myWheel){ Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel); } 这里,您正在将类型为Wheel的myWheel传递给需要IntPtr的函数。您需要传递当前命名错误
public void GiveWheel(Wheel myWheel){
Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel);
}
这里,您正在将类型为Wheel的myWheel传递给需要IntPtr的函数。您需要传递当前命名错误的nativeCarObject的Wheel类的私有字段
其他要点:
正如我在上面所暗示的,轮子的nativeCarObject成员应该重命名为nativeWheelObject。
DLL似乎使用cdecl调用约定。您应该在p/invoke声明中指定。
看起来您的代码泄漏了DLL提供的对象。我想你需要提供一些清洁助手。
代码可能如下所示:
public class Car
{
public readonly IntPtr nativeCarObject = Sim.DLL_AddCar();
public void GiveWheel(Wheel myWheel)
{
Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel.nativeWheelObject);
}
}
public class Wheel
{
public readonly IntPtr nativeWheelObject = Sim.DLL_AddWheel();
}
internal class Sim
{
public const string pluginName = "MyDLL";
[DllImport(pluginName, CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr DLL_AddCar();
[DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr DLL_AddWheel();
[DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)]
public static extern void DLL_GiveWheelToCar(IntPtr car, IntPtr wheel);
}
此代码仍在泄漏这些对象。我会让你解决的。谢谢!我做了改变。关于对象本身,我创建了一个GetObject方法,它返回其IntPtr。有可能从IntPtr派生吗?我认为从IntPtr派生是没有意义的。
public void GiveWheel(Wheel myWheel){
Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel);
}
public class Car
{
public readonly IntPtr nativeCarObject = Sim.DLL_AddCar();
public void GiveWheel(Wheel myWheel)
{
Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel.nativeWheelObject);
}
}
public class Wheel
{
public readonly IntPtr nativeWheelObject = Sim.DLL_AddWheel();
}
internal class Sim
{
public const string pluginName = "MyDLL";
[DllImport(pluginName, CallingConvention=CallingConvention.Cdecl)]
public static extern IntPtr DLL_AddCar();
[DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr DLL_AddWheel();
[DllImport(pluginName, CallingConvention = CallingConvention.Cdecl)]
public static extern void DLL_GiveWheelToCar(IntPtr car, IntPtr wheel);
}