C# 在同一个函数中封送2个IntPtr? 我想知道如何用C语言编排我用C++制作的2个课程。 一个教程链接将是完美的,我试图谷歌这为自己,但我的英语知识不是那么先进,搜索正确的东西。我是一个新的从C++到c的封送处理系统

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的函数。您需要传递当前命名错误

好的,基本上我有这样的东西:

C++

C

现在我的问题是在哪里使用DLL_GiveWheelToCar? 我尝试的方法被注释掉了,因为它不起作用,这是一个逻辑错误还是我应该改变封送的方式

谢谢你的建议

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);
}