【问题标题】:C# wrapper design for DLL with P/Invoke带有 P/Invoke 的 DLL 的 C# 包装器设计
【发布时间】:2010-09-16 06:36:45
【问题描述】:

我需要关于为非托管 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. 包装类应该与对象巧妙地集成在一起,并尽可能多地隐藏“非托管方式”的工作方式

我倾向于第二个选项,但我想听听其他意见,因为这两种方式各有利弊。

【问题讨论】:

    标签: c# pinvoke wrapper dllimport


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我也有同样的想法。
    【解决方案2】:

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

    一般来说,尽可能隐藏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      相关资源
      最近更新 更多