带P / Invoke的DLL的C#包装器设计

时间:2010-09-15 21:43:14

标签: c# pinvoke wrapper dllimport

我需要为编写非托管C ++ DLL的托管(C#)包装器提出意见。

假设我有一个这样的对象:

public class ManagedObject
{
  public void DoSomethingWithTheObject()
  {

  }
}

并假设DoSomethingWithTheObject()方法必须调用非托管DLL方法。

现在我想到了两种可接受的可能性:

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

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

我基本上要问的是

  1. 包装类应该只是非托管方法的包装器,所有对象都直接调用这些方法

  2. 包装类应该与对象整齐地集成在一起并隐藏尽可能多的“非托管方式”

  3. 我倾向于第二种选择,但我希望听到其他一些意见,因为这两种方式各有利弊。

2 个答案:

答案 0 :(得分:4)

选项2.这是.NET Framework本身的基本原则之一:提供一组一致的托管库,无论它们包装的非托管API的形状如何。

您的包装应尽可能遵循.NET Class Library Design Guidelines。当托管包装器开始感觉像纯C#而不是非托管DLL上的层时,您就会知道自己走在正确的轨道上。

答案 1 :(得分:2)

正如您所知,第二种选择总是更可取但现在总是可行的。抽象不受管理或不安全的部分更好,但有时客户端应用程序必须做出决策或提供许多信息。在后一种情况下,您最终会编写许多仅模仿其未管理对应项的类。

一般情况下,尽可能隐藏。