Какой подход я могу использовать для вызова не-c-стиля нативный интерфейс C ++, который только из DLL из .NET? - PullRequest
1 голос
/ 22 июля 2010

Я просматриваю Интернет более 48 часов, читая о совместимости и играя с Pinvoke и C ++ / Cli (последнее очень ограничено).Существует неуправляемый API C ++ (пространство имен, содержащее множество экспортируемых структур, которые содержат методы, все чисто виртуальные и реализованы в нескольких файлах cpp в виде классов, а что нет), и я хотел бы вызвать их из .NET.У меня на самом деле нет доступа к исходному коду, только к результирующей dll и так. Кажется, c ++ / cli не будет работать.Но с другой стороны, мне не удалось найти примеры, учебные пособия или документацию по использованию Pinvoke для не-c-стиля, такого как apis, который имеет пространство имен и структуры и классы, содержащие методы.Я полагаю, если они выставлены, dll ДОЛЖЕН содержать точки входа, хотя и искаженные по имени ... мой единственный выбор без доступа к исходному коду тогда сделать это?И если я могу также спросить… если у меня есть доступ к исходному коду, какой самый ненавязчивый способ (т. Е. Требующий наименьшего количества изменений, если таковые имеются) обернуть API для использования .net?

Спасибо

1 Ответ

0 голосов
/ 22 июля 2010

Если у вас есть заголовок (или вы можете сделать его из документации), вы сможете написать оболочку C ++ / CLI. Это просто C ++. В идеале должна быть удобная библиотека, тогда вы можете просто включить ссылку на заголовок в библиотеку.

Ваш код C ++ / CLI будет простой оболочкой для неуправляемых классов, что-то вроде:

public ref class Foo
{
  private:
     NativeFoo f;
  public:
    int method1(int i) {return f.method1(int i);}
// etc
};

[заявление об отказе: я набираю код в поле для ответов. Возможные опечатки, я полагаю.]

Вы создаете это, ваш код C # добавляет ссылку на результирующую сборку, затем в вашем коде C # вы просто используете Foo в качестве управляемого типа.

Это будет намного проще, чем вычисление искаженных имен. Да

...