2010-09-15 1 views
0

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

Скажем, у меня есть объект вроде этого:

public class ManagedObject 
{ 
    public void DoSomethingWithTheObject() 
    { 

    } 
} 

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

В настоящее время существует два приемлемых возможностей, которые приходят на ум:

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

и

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

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

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

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

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

ответ

4

Вариант 2. Это один из принципов, лежащих в основе самой .NET Framework: предоставить набор управляемых библиотек, которые являются совместимыми независимо от формы неуправляемых API-интерфейсов, которые они обертывают.

Ваша обертка должна, насколько это возможно, следовать за .NET Class Library Design Guidelines. Вы узнаете, что находитесь на правильном пути, когда ваша управляемая оболочка начинает чувствовать себя как чистый C# вместо слоя над неуправляемой DLL.

+0

Спасибо. У меня были те же мысли. –

+0

1+. Для вашего лучшего ответа. – Aliostad

2

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

Как правило, спрячьте столько, сколько сможете.