Как связать C# и блоки C++ в единственный исполняемый файл?

У меня есть решение VS2008 containg проект, который генерирует исполняемый файл C#, который ссылается на проект, который генерирует dll, содержащий и C++ / CLI и неуправляемый C++.

Я хотел бы объединить их в единственный исполняемый файл, поскольку C++ dll содержит код в системе защиты, который я хочу встроить в основной исполняемый файл.

Я не могу использовать ILMerge, поскольку dll содержит и управляемый и неуправляемый код. Предложенное решение, кажется, для использования link.exe для соединения блока C# с файлами объекта C++. Это - то, что я пытаюсь сделать.

Я вручную отредактировал файл проекта для c# исполняемого файла для генерации netmodule. Я добавил, что сборка сообщения ступает в исполняемый проект выполнить link.exe для соединения c# netmodule и скомпилированных файлов объекта C++ вместе, затем выполняет mt.exe для слияния манифестов сборки, созданных обоими проектами. Это работает успешно, но exe все еще содержит ссылку на и использует типы C++, определенные в dll, сгенерированном нормальным процессом сборки для проекта C++.

Я затем указал/NOASSEMBLY в настройках проекта для C++ dll, таким образом, он также генерирует netmodule. В проекте C# я удалил ссылку на проект C++, но добавил зависимость проекта в решении. Я вручную отредактировал файл проекта C# для включения подобный:


    

т.е. ссылаться на C++ netmodule, который теперь сгенерирован проектом C++.

Однако теперь компоновщик ступает в мои сбои события сборки сообщения с:

error LNK2027: unresolved module reference 'librarycode.netmodule'
fatal error LNK1311: 1 unresolved module references: 

Это совершенно понятно, поскольку я не связываюсь в librarycode netmodule; я связываюсь в файлах объекта C++, используемых для генерации netmodule вместо этого.

Таким образом короче говоря, как я объединяю c# исполняемый и объект C++ файлы в единственный блок? Что я пропустил?

Мой источник ссылки до сих пор (независимо от ссылки линии передачи команд link.exe и т.д. на MSDN) является двумя после статей:

Заранее большое спасибо.


Update1

Я последовал точно примеру в блоге Steve Teixeira и проверил, что он работает. Используя отражатель, я вижу, что получающийся исполняемый файл содержит два netmodules. c# netmodule содержит ссылку на другой netmodule, но без имени?! При перемещении блока в новый каталог второй netmodule становится не имеющим ссылки (очевидно), но исполняемый файл все еще работает, поскольку типы с корректным определением существуют в c# netmodule.

Обратите внимание, что исходный c# netmodule действительно содержит именованную ссылку на C++ netmodule, таким образом, это должен быть шаг компоновщика, который удаляет имя.

Пытаясь последовать этому примеру в моем демонстрационном проекте, я добавил, что/ASSEMBLYMODULE аргумент моему сообщению создает шаг компоновщика. Компоновщик теперь перестал работать с

LNK2022: metadata operation failed (80040427) : Public type 'MixedLanguageLibrary.Class1' is defined in multiple places in this assembly: 'MixedLanguageDemo.exe' and 'mixedlanguagelibrary.netmodule'
LINK : fatal error LNK1255: link failed because of metadata errors

Я предполагаю, что это - волшебство компоновщика, которое удаляет имя ссылки на модули, которое я пропускаю.

Любые приветствующиеся идеи.


Update2

Я уменьшил свой проект до самого простого, и пытаюсь скомпилировать, из командной строки. Следующий пакетный файл успешно создает пример в блоге Steve Teixeira:

setlocal    
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
if errorlevel 1 goto End
cl /c /MD nativecode.cpp
if errorlevel 1 goto End
cl /clr /LN /MD clrcode.cpp nativecode.obj
if errorlevel 1 goto End
csc /target:module /addmodule:clrcode.netmodule Program.cs
if errorlevel 1 goto End
link /LTCG /CLRIMAGETYPE:IJW /ENTRY:ConsoleApplication1.Program.Main /SUBSYSTEM:CONSOLE /ASSEMBLYMODULE:clrcode.netmodule /OUT:MixedApp.exe clrcode.obj nativecode.obj program.netmodule
:End

Следующему пакетному файлу не удается создать мой пример кода с ошибкой компоновщика LNK2022:

setlocal
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
if errorlevel 1 goto End
cl /c /MD messageprovider.cpp
if errorlevel 1 goto End
cl /clr /LN /MD managedmessageprovider.cpp messageprovider.obj
if errorlevel 1 goto End
csc /target:module /addmodule:managedmessageprovider.netmodule Program.cs Form1.cs Form1.Designer.cs
if errorlevel 1 goto End
link /LTCG /CLRIMAGETYPE:IJW /ENTRY:MixedLanguageDemo.Program.Main /SUBSYSTEM:WINDOWS /ASSEMBLYMODULE:managedmessageprovider.netmodule /OUT:MixedLanguageDemo.exe managedmessageprovider.obj messageprovider.obj program.netmodule
:End

Время для пятна различие :-(

10
задан swingkid 26 October 2010 в 16:59
поделиться

1 ответ

Ваш бизнес-сценарий очень похож на SQLite, поэтому тот же подход должен работать и для вас. В основном они вставляют управляемую сборку в неуправляемую dll как отдельный раздел данных. Затем они могут п / вызывать неуправляемую dll из управляемой dll обычным способом. Также возможно динамическое связывание с неуправляемым кодом в dll.

0
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: