Связывание кода без CLR с приложением .NET - PullRequest
0 голосов
/ 25 мая 2009

Я новичок в Visual C ++, .NET и мире программирования Windows (из Objective-C / Cocoa), и я пытаюсь использовать библиотеку CFLite (Open CoreFoundation Lite), которую я скомпилировал в .lib файл. Он написан на чистом неуправляемом C, и я хотел бы использовать его в своем управляемом приложении CLR .NET. Когда я пытаюсь связать его и использовать функцию CFSTR, которая является ярлыком для __CFStringMakeConstantString, она ужасно терпит неудачу. Любой совет? Прилагается ошибка.

Proj.obj : error LNK2031: unable to generate p/invoke for "extern "C" struct __CFString const * __clrcall __CFStringMakeConstantString(char const *)" (?__CFStringMakeConstantString@@$$J0YMPBU__CFString@@PBD@Z); calling convention missing in metadata
Proj.obj : warning LNK4248: unresolved typeref token (01000016) for '__CFString'; image may not run
Proj.obj : error LNK2028: unresolved token (0A00000B) "extern "C" struct __CFString const * __clrcall __CFStringMakeConstantString(char const *)" (?__CFStringMakeConstantString@@$$J0YMPBU__CFString@@PBD@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)
Proj.obj : error LNK2019: unresolved external symbol "extern "C" struct __CFString const * __clrcall __CFStringMakeConstantString(char const *)" (?__CFStringMakeConstantString@@$$J0YMPBU__CFString@@PBD@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)

ОБНОВЛЕНИЕ: я закончил тем, что просто пошел с собственным приложением с вызовами Win32, так как мой пользовательский интерфейс все равно будет минимальным (это фоновое приложение). Я немного поигрался с p / invoke, и это казалось сложным для новичка, такого как я: p Спасибо!

Ответы [ 3 ]

1 голос
/ 25 мая 2009

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

Технология .Net, используемая для связи между управляемым миром и неуправляемым миром, называется PInvoke. Лучший источник примеров использования PInvoke - pinvoke.net . Ваши сигнатуры С-функций выглядят очень просто, поэтому будет просто создать соответствующую сигнатуру в C ++ с правильно распределенными параметрами.

1 голос
/ 25 мая 2009
0 голосов
/ 25 мая 2009

Я знаю, как работать с управляемым кодом из неуправляемого кода - это создать DLL или работать с COM.

...