swi*_*kid 10 c# linker c++-cli visual-c++
我有VS2008解决方案包含一个项目,该项目生成一个C#可执行文件,该项目引用了一个生成包含C++/CLI和非托管C++的DLL的项目.
我想将这些合并到一个可执行文件中,因为C++ DLL包含我想要嵌入主可执行文件的安全代码.
我不能使用ILMerge,因为dll包含托管代码和非托管代码.建议的解决方案似乎是使用link.exe将C#程序集与C++目标文件链接起来.这就是我想要做的.
我手动编辑了c#可执行文件的项目文件以生成netmodule.我在可执行项目中添加了一个构建后步骤,以运行link.exe将c#netmodule和已编译的C++目标文件链接在一起,然后运行mt.exe来合并两个项目创建的程序集清单.这运行成功,但是exe仍然包含对C++项目的正常构建过程生成的dll中定义的c ++类型的引用和使用.
然后我在C++ dll的项目设置中指定了/ NOASSEMBLY,因此它还生成了一个netmodule.在C#项目中,我删除了对C++项目的引用,但在解决方案中添加了项目依赖性.我手动编辑了C#项目文件,包括类似于:
<ItemGroup>
<AddModules Include="..\Debug\librarycode.netmodule" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
即引用现在由C++项目生成的C++ netmodule.
但是,现在我的post build事件中的链接器步骤失败了:
error LNK2027: unresolved module reference 'librarycode.netmodule'
fatal error LNK1311: 1 unresolved module references:
Run Code Online (Sandbox Code Playgroud)
这完全可以理解,因为我没有链接到librarycode netmodule; 我链接在用于生成netmodule的C++目标文件中.
简而言之,如何将ac#executable和C++目标文件合并到一个程序集中?我错过了什么?
到目前为止我的引用源(来自MSDN上的link.exe命令链接引用等)是以下两篇文章:
非常感谢你提前.
我在Steve Teixeira的博客中完全遵循了这个例子,并证实它有效.使用反射器,我可以看到生成的可执行文件包含两个netmodule.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
Run Code Online (Sandbox Code Playgroud)
我猜这是链接器魔术删除我缺少的模块引用名称.
欢迎任何想法.
我已经尽可能简化了我的项目,我试图从命令行编译.以下批处理文件在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
Run Code Online (Sandbox Code Playgroud)
以下批处理文件无法使用链接器错误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
Run Code Online (Sandbox Code Playgroud)
时间点差异:-(
您的业务案例与 SQLite 非常相似,因此相同的方法应该适合您。基本上,他们将托管程序集作为单独的数据部分插入到非托管 dll 中。然后,他们能够以正常方式从托管 dll 中 p/调用非托管 dll。还可以动态链接到 dll 中的非托管代码。
| 归档时间: |
|
| 查看次数: |
6806 次 |
| 最近记录: |