2010-09-15 41 views
0

我需要爲非託管C++ DLL編寫託管(C#)包裝器的意見。用於DLL的C#包裝器設計P/Invoke

比方說,我有一個這樣的對象:

public class ManagedObject 
{ 
    public void DoSomethingWithTheObject() 
    { 

    } 
} 

,並假設DoSomethingWithTheObject()方法,使非託管DLL方法的調用。

現在有浮現在我的腦海兩種可以接受的可能性:

public void DoSomethingWithTheObject() 
{ 
    DllWrapperClass.DirectCallToUnmanagedMethod(some_value_type); 
} 

public void DoSomethingWithTheObject() 
{ 
    DllWrapperClass.MethodName(this); 
} 

什麼我基本上問的是,如果

  1. 包裝類應僅僅是一個非託管方法的包裝,所有對象直接調用這些方法

  2. 包裝類應與對象整齊地集成和隱藏之多,possbile

我傾向於第二種選擇工作的「非託管的方式」,但我想聽取其他意見,因爲這兩種方式各有利弊。

回答

4

選項2.這是.NET框架本身的基本原理之一:提供一組託管庫,它們無論它們包裝的非託管API的形狀如何都是一致的。

你的包裝應儘可能遵循.NET Class Library Design Guidelines。當您的託管包裝器開始感覺像純C#而不是非託管DLL上的一層時,您會知道自己處於正確的軌道上。

+0

謝謝。我有完全一樣的想法。 – 2010-09-15 22:23:06

+0

1+。爲了您更好的答案。 – Aliostad 2010-09-15 22:41:50

2

正如你所想的那樣,第二個選項總是可取的,但現在總是可以的。抽象的非託管或不安全的部分更好,但有時客戶端應用程序必須做出決定或提供許多信息。在後一種情況下,你最終會寫很多隻能模仿非託管對象的類。

一般來說,儘可能地隱藏起來。