我需要为编写非托管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);
}
我基本上要问的是
包装类应该只是非托管方法的包装器,所有对象都直接调用这些方法
包装类应该与对象整齐地集成在一起并隐藏尽可能多的“非托管方式”
我倾向于第二种选择,但我希望听到其他一些意见,因为这两种方式各有利弊。
答案 0 :(得分:4)
选项2.这是.NET Framework本身的基本原则之一:提供一组一致的托管库,无论它们包装的非托管API的形状如何。
您的包装应尽可能遵循.NET Class Library Design Guidelines。当托管包装器开始感觉像纯C#而不是非托管DLL上的层时,您就会知道自己走在正确的轨道上。
答案 1 :(得分:2)
正如您所知,第二种选择总是更可取但现在总是可行的。抽象不受管理或不安全的部分更好,但有时客户端应用程序必须做出决策或提供许多信息。在后一种情况下,您最终会编写许多仅模仿其未管理对应项的类。
一般情况下,尽可能隐藏。