Создание экземпляра класса C в .файл lib из C#

#c# #.net #c

#c# #.net #c

Вопрос:

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

Ответ №1:

Безусловно, самый простой вариант — создать библиотеку-оболочку на C / CLI.

Комментарии:

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

2. Что сказал @marcelo-cantos: используйте C / CLI в качестве моста между управляемым и неуправляемым мирами. Это просто. Единственные другие варианты, которые у вас есть, это (1) написать библиотеку DLL-оболочку, которая экспортирует внешние функции «C», которые вызывают ваши существующие объекты C . Затем используйте [DllImport] в C # для вызова функций C библиотеки DLL. Или (2) оберните свои собственные классы C в COM-интерфейсы и используйте C # COM Interop для вызова методов в классах. Мост C / CLI, безусловно, самый простой вариант.

3. @dripdeef: Это должно быть ответом.

4. Я работал над этим, поскольку COM-взаимодействие, похоже, допускает только dll, а у меня есть lib. У меня просто возникли некоторые проблемы с преобразованием управляемой строки в QString и т.д. Но я уверен, что со временем я с этим разберусь.

5. @dko: Нет, не используйте COM-взаимодействие. Создайте проект на C / CLI и привяжите к нему свои статические библиотеки напрямую. Напишите классы C / CLI (которые являются . Сетевые классы), которые действуют как простые оболочки для собственных классов в библиотеках, и все готово. Затем вы можете связать проект C / CLI с вашим проектом C #. Компилятор C / CLI автоматически сгенерирует весь необходимый код взаимодействия для вызова собственного статического кода из управляемых классов C . Они называют это IJW, что означает «Это просто работает».

Ответ №2:

Я боюсь, что класс экспортируется из native .внутри C # невозможно использовать файлы lib. Но, используя C Cli, вы могли бы обернуть класс и использовать его через класс-оболочку .net. Но этот подход также требует включения файла заголовка (.h или .hpp).

Библиотеки DLL COM — это другая история. На них можно ссылаться в проекте C #, и MSVS автоматически оборачивает собственные классы.

Ответ №3:

Что сказал @marcelo-cantos: используйте C / CLI в качестве моста между управляемым и неуправляемым мирами. Это просто.

Единственными другими вариантами, которые у вас есть, являются:

(1) Напишите библиотеку DLL-оболочку, которая экспортирует внешние функции «C», вызывающие ваши существующие объекты C . Затем используйте [DllImport] и PInvoke в C # для вызова функций C библиотеки DLL.

(2) Оберните свои собственные классы C в COM-интерфейсы и используйте C # COM Interop для вызова методов в классах.

Мост C / CLI, безусловно, самый простой вариант.