C # дизайн оболочки для DLL с P / Invoke - PullRequest
0 голосов
/ 16 сентября 2010

Мне нужно мнение о написании управляемой (C #) оболочки для неуправляемой C ++ DLL.

Допустим, у меня есть такой объект:

public class ManagedObject
{
  public void DoSomethingWithTheObject()
  {

  }
}

и предположим, что метод DoSomethingWithTheObject () должен выполнить вызов неуправляемого метода DLL.

Теперь мне на ум приходят две приемлемые возможности:

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

и

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

Что я в основном спрашиваю, если

  1. класс-обертка должен быть просто оберткой для неуправляемых методов, и все объекты вызывают эти методы напрямую

  2. класс-обёртка должен быть аккуратно интегрирован с объектами и скрывать как можно больше «неуправляемого способа» работы

Я склоняюсь ко второму варианту, но я хотел бы услышать некоторые другие мнения, поскольку оба способа имеют свои плюсы и минусы.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2010

Вариант 2. Это один из принципов, лежащих в основе самой .NET Framework: предоставить набор управляемых библиотек, которые являются согласованными независимо от формы неуправляемых API, которые они переносят. .NET Design Guidelines насколько это возможно.Вы поймете, что находитесь на правильном пути, когда ваша управляемая оболочка начинает ощущаться как чистый C # вместо слоя над неуправляемой DLL.

2 голосов
/ 16 сентября 2010

Как вы уже поняли, второй вариант всегда предпочтительнее, но теперь всегда возможен.Абстрагироваться от неуправляемых или небезопасных частей лучше, но иногда клиентское приложение должно принимать решения или предоставлять много информации.В этом последнем случае вы заканчиваете тем, что пишете много классов, которые имитируют только своих неуправляемых коллег.

Как правило, скрывайте как можно больше.

...