Импорт C++.lib и.H файл в проект c#?

Я только что начал проект C# и хочу импортировать C++ .lib и соответствующий заголовок (.H-файл).

Я читал различные сообщения, которые все упоминают .dll, а не .Либ, что сбивает меня с толку.

изображение ниже показывает .lib и .H файл, о котором я говорю, все, что я сделал, это перетащил их в проект.

enter image description here

может ли кто-нибудь указать мне на более четкое объяснение того, как это сделать? Я уверен, что это не может быть так сложно, как кажется.

3 ответов


что вы могли бы сделать, это создать оболочку C++/CLI и предоставить функциональность lib, которую вы хотите использовать через свою оболочку. Созданная dll-оболочка, на которую вы можете легко ссылаться в своем проекте C#. Это, конечно, требует немного работы для создания управляемой / неуправляемой оболочки, но окупится в долгосрочной перспективе.

для создания управляемого проекта c++ выберите в разделе Шаблоны проектов c++ CLR и библиотека классов. Здесь вы можете ссылаться на свой lib, использовать файл заголовка так, как вы привыкший.

затем создайте новый класс (ref class) и оберните в него свою библиотеку. Пример может выглядеть примерно так:

LibHeader.h

int foo(...);

вы написать класс-оболочку, как это: Заголовок:

Wrapper.h

public ref class MyWrapper
{
    public:
        int fooWrapped();
};

Реализация:

Wrapper.cpp

#include Libheader.h

int MyWrapper::fooWrapped()
{
     return foo();
}

пространства имен и все хорошие вещи опущены для простоты. Теперь вы можете использовать MyWrapper в коде C# так же просто, как и любой другой управляемый класс. Конечно, когда интерфейс lib становится более сложным, вы должны подумайте об этом немного больше, но это может помочь отделить lib-код от вашего приложения. Надеюсь пролить свет на это.


это, к сожалению, нетривиальная проблема.

причина в первую очередь из-за того, что C++ это неуправляемый язык. C# это управлял язык. Управляемый и неуправляемый относится к тому, как язык управляет памятью.

  • C++ вы должны сделать свое собственное управление памятью (выделение и освобождение),
  • C# .NET Framework управление памятью с мусор коллекционер!--27-->.

в коде вашей библиотеки

вы должны убедитесь, что все места, которые вы называете new должен delete, и malloc и free если вы используете C конвенций.

вам придется создать кучу wrapper-классы вокруг ваших вызовов функций и убедитесь, что у вас нет утечки памяти в вашем C++ код.

в проблема

ваша главная проблема (насколько мне известно) заключается в том, что вы не сможете вызвать эти функции прямо в C#, потому что вы не можете статически связать неуправляемого кода в управляемый код.

вам придется написать .DLL, чтобы обернуть все ваши библиотечные функции в C++. Как только вы это сделаете, вы можете использовать C# функции взаимодействия для вызова этих функций из DLL.

[DllImport("your_functions.dll", CharSet = CharSet.Auto)]
public extern void your_function();

Это "так трудно, как кажется". C++ и C# амбивалентно. Первая имеет детерминированное разрушение, вторая-нет. Теперь вы пишете C++ / cli, задерживая разрушение до некоторого финализатора, вызываемого сборщиком мусора, работающим в своем собственном потоке, вводя проблемы повсюду (безопасность потока, являются ли члены C++ (используемые в c++/cli) допустимыми?, ...). Хуже того, GC может предложить, чтобы объекты C++ были крошечными (указатель) и провоцировали утечку памяти (из-за позднего освобождения крошечных объектов). По существу, вы заканчиваете тем, что пишете GC поверх C++/cli GC для удаления non C++ / cli (!) объекты в основном потоке или другом. Все это безумие ...