2014-01-17 45 views
0

我想知道如何編組2個類,我用C#語言編寫的C++。我試過Google自己的這個,但是我的英語知識並不是那種進步,爲了尋找正確的東西,我是從C++到C#編組的新手)Marshal 2 IntPtr在相同的功能?

那麼基本上是什麼我已經是這樣的:

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_GiveWheel ToCar「? 我試過的方法被註釋掉了,因爲它沒有工作,是邏輯錯誤,還是應該改變我編組的方式?

感謝您的諮詢。

回答

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

這裏你逝去的myWheel這是Wheel類型的給需要IntPtr的功能。您需要傳遞Wheel類的當前(錯誤)名稱爲nativeCarObject的專用字段。

其他要點:

  1. 正如我上面暗示的WheelnativeCarObject構件應該被重命名爲nativeWheelObject
  2. 該DLL看起來像它使用cdecl調用約定。你應該在你的p/invoke聲明中指定它。
  3. 它看起來像你的代碼泄漏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); 
} 

此代碼仍泄漏的對象。我會讓你解決這個問題。

+0

謝謝!我做了改變。 關於對象本身,我做了一個GetObject方法,它返回它的IntPtr。是否有可能從IntPtr以某種方式派生? – JohnYouDontLike

+0

我不認爲從'IntPtr'派生是有意義的。 –