Вступление : Как объединить неуправляемую dll и управляемую сборку в один файл?
По сравнению с вопросом выше, мне нужно объединить DLL так, чтобы
финальная смешанная DLL может экспортировать свои функции в другие неуправляемые
Приложения.
Для этого я хотел бы скомпилировать их как .netmodule, а затем объединить их в один файл с компоновщиком, поэтому у меня есть:
1) Libs — проект с некоторой библиотекой в C # — он не имеет никаких зависимостей, и я могу легко скомпилировать его как .netmodule
2) Ссылки — неуправляемый проект C ++, имеющий ссылку на библиотеку C #, и, к сожалению, я не могу собрать его с помощью компилятора cl.exe, поскольку он всегда выдает ошибку о том, что пространство имен из библиотеки C # не может быть найдено, даже если я пытался указать компилятору на во всех папках, где можно найти ссылку на мою сборку C #, этот проект C ++ используется как простая оболочка C ++ поверх методов CLR из C #
Вот мой пакетный скрипт и вторая строка выдает ошибку:
"c:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe" /target:module /out:./Build/libs.netmodule Libs\Properties\*.cs Libs\*.cs
"c:/Program Files/Microsoft Visual Studio 12.0/VC/bin/cl.exe" /clr /AI"D:\T\CPlus\Library\Release" /AI"D:\T\CPlus\Library\Libs" /AI"D:\T\CPlus\Library\Libs\Properties" /LN Links\*.cpp
Вопрос Кто-нибудь теперь, как дать C ++ знать, где он может найти сборку C # для разрешения ссылки или, может быть, мне нужно как-то явно упомянуть мои заголовочные файлы в пакетных командах?
Исходный код : C # — это просто пустой класс с методом Foo, а C ++ выглядит следующим образом.
// Links.h
#pragma once
#define DllExport extern "C" __declspec(dllexport)
using namespace System;
using namespace Libs; // cl.exe cannot resolve this reference
// Links.cpp
#include "Links.h"
DllExport int __stdcall Execute()
{
Libs::CLibrary::Foo();
}
Вот окончательная рабочая версия.
"c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /target:module /out:Libs.netmodule /recurse:..\Libs\*.cs
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\cl.exe" /clr /LN /Fo /Y- /Z7 /FU Libs.netmodule ..\Links\Links.cpp /link /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib""c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\link.exe" /DLL /LTCG /CLRIMAGETYPE:IJW /OUT:Library.dll Libs.netmodule Links.obj /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib"
Полезные ссылки :
Теперь я могу использовать экспортированные функции из .NET в неуправляемых приложениях. Более того, вся информация из обоих проектов — Links (C ++) и Libs (C #) — была сгруппирована в один файл — Library.dll. Таким образом, я могу объединить в одну DLL столько проектов, сколько захочу, и не имеет значения, являются ли они управляемыми или нативными.