Marshal 2 IntPtr在同一个功能中?

时间:2014-01-17 13:45:39

标签: c# c++ dll pinvoke marshalling

我想知道如何编组我用C#语言在C ++中创建的2个类。 (一个教程链接将是完美的,我试图为自己谷歌这个,但我的英语知识不是那么先进,寻找正确的东西。我是从C ++到C#编组的新手)

基本上我拥有的是这样的东西:

C ++

EXPORT_API CarClass* DLL_AddCar();
EXPORT_API CarWheel* DLL_AddWheel();
EXPORT_API void DLL_GiveWheelToCar(CarClass* car,CarWheel* wheel);

C#

public class Car
{       
    #region Members     
    private IntPtr nativeCarObject; 
    #endregion Members

    public Car()
    {           
        this.nativeCarObject = Sim.DLL_AddCar();

    }

    // ---> this part is not working
    //#region Wrapper methods           
    //public void GiveWheel(Wheel myWheel){Sim.DLL_GiveWheelToCar(this.nativeCarObject,myWheel);}
    //#endregion Wrapper methods
}

public class Wheel
{       
    #region Members     
    private IntPtr nativeCarObject; 
    #endregion Members

    public Wheel()
    {           
        this.nativeCarObject = Sim.DLL_AddWheel();

    }
}   

internal class Sim
{
    public const string pluginName = "MyDLL";   

    #region PInvokes
    [DllImport(pluginName)] public static extern IntPtr DLL_AddCar();
    [DllImport(pluginName)] public static extern IntPtr DLL_AddWheel();
    [DllImport(pluginName)] public static extern void DLL_GiveWheelToCar(IntPtr car,IntPtr wheel);
    #endregion PInvokes 
}

现在我的问题是我在哪里使用“DLL_GiveWheelToCar”? 我尝试的方法被注释掉了,因为它没有用,是逻辑错误还是我应该改变我编组的方式?

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

public void GiveWheel(Wheel myWheel){
    Sim.DLL_GiveWheelToCar(this.nativeCarObject, myWheel);
}

在这里,您将myWheel类型为Wheel的{​​{1}}传递给期望IntPtr的函数。您需要传递当前(错误)名为Wheel的{​​{1}}类的私有字段。

其他要点:

  1. 如上所述,nativeCarObject nativeCarObject成员应重命名为Wheel
  2. DLL看起来像是使用nativeWheelObject调用约定。您应该在p / invoke声明中指定它。
  3. 看起来您的代码泄漏了DLL提供的对象。我怀疑你需要提供一些整洁的帮手。
  4. 代码可能看起来像这样:

    cdecl

    此代码仍在泄露这些对象。我会让你解决这个问题。