Импорт C++.lib и.H файл в проект c#?
Я только что начал проект C# и хочу импортировать C++ .lib и соответствующий заголовок (.H-файл).
Я читал различные сообщения, которые все упоминают .dll, а не .Либ, что сбивает меня с толку.
изображение ниже показывает .lib и .H файл, о котором я говорю, все, что я сделал, это перетащил их в проект.
может ли кто-нибудь указать мне на более четкое объяснение того, как это сделать? Я уверен, что это не может быть так сложно, как кажется.
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 (!) объекты в основном потоке или другом. Все это безумие ...