Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有P/Invoke的DLL的C#包装器设计 我需要编写一个托管的(C++)包装,用于非托管C++ DLL。_C#_Pinvoke_Wrapper_Dllimport - Fatal编程技术网

带有P/Invoke的DLL的C#包装器设计 我需要编写一个托管的(C++)包装,用于非托管C++ DLL。

带有P/Invoke的DLL的C#包装器设计 我需要编写一个托管的(C++)包装,用于非托管C++ DLL。,c#,pinvoke,wrapper,dllimport,C#,Pinvoke,Wrapper,Dllimport,假设我有一个这样的物体: public class ManagedObject { public void DoSomethingWithTheObject() { } } 假设doSomethingWithObject()方法必须调用非托管DLL方法 现在我想到了两个可以接受的可能性: public void DoSomethingWithTheObject() { DllWrapperClass.DirectCallToUnmanagedMethod(some_val

假设我有一个这样的物体:

public class ManagedObject
{
  public void DoSomethingWithTheObject()
  {

  }
}
假设doSomethingWithObject()方法必须调用非托管DLL方法

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

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

我基本上想问的是

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

  • 包装器类应该与对象巧妙地集成,并尽可能隐藏“非托管方式”的工作方式


  • 我倾向于第二种选择,但我想听听其他一些意见,因为两种方法都有各自的优缺点。

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


    您的包装器应该尽可能遵循。当托管包装器开始感觉像纯C,而不是非托管DLL上的层时,您就会知道自己走对了方向。

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


    您的包装器应该尽可能遵循。当托管包装器开始感觉像是纯C,而不是非托管DLL上的层时,您就会知道自己走上了正确的道路。

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


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


    一般来说,尽量隐藏起来。

    谢谢。我也有同样的想法。谢谢。我有完全相同的想法。
    public void DoSomethingWithTheObject()
    {
        DllWrapperClass.MethodName(this);
    }