Вместо использования P / Invoke, если вы сами управляете нативной библиотекой, вы можете написать набор классов C ++ / CLI, которые обертывают нативные вызовы. Во многих случаях это будет работать лучше, чем использование вызова платформы, и вы получите дополнительное преимущество правильности типа. Например, если у вас есть какой-то C API, подобный следующему (он не делает ничего полезного, я просто добавил указатели и структуры, чтобы подчеркнуть тот факт, что это собственный код):
struct SomeStruct {
int a, b;
int* somePtr;
};
int foo(struct SomeStruct* a, int b) {
*a->somePtr = a->a + a->b;
return a->b * *a->somePtr + b;
}
Вы можете создать класс C ++ / CLI, чтобы обернуть его:
public ref class MyNativeAPI {
private:
SomeStruct* x;
public:
MyNativeAPI() {
x = new SomeStruct;
}
~MyNativeAPI() {
delete x;
}
int Foo(int a) {
pin_ptr<SomeStruct*> ptr = this->x;
return foo(ptr, a);
}
}
Затем вы можете вызвать это в C #:
MyNativeAPI a = new MyNativeAPI();
if(a.Foo(5) > 5) { ... };
Вам нужно будет прочитать больше о C ++ / CLI, чтобы понять новые имеющиеся у вас элементы управления как для управляемой, так и для собственной кучи, а также предостережения относительно их смешивания (например, pin_ptr
, который я использовал выше), но В целом, это гораздо более элегантное решение для реализации встроенного взаимодействия в .NET.