2

我有一个使用 VS2008 用 C# 编写的小型 WPF 应用程序。对于一项特定任务,我想使用一些 C++/CLI 代码(因为它需要大量的本机互操作)。

我知道我可以将 C++/CLI 代码编译为 DLL,然后从 C# 应用程序中引用它,但是当相关代码相当小时,这似乎很愚蠢。我想将它们构建到同一个文件中。(并且无需在运行时提取 DLL。)

在将 C++ 代码编译为 C# DLL 时,我已经成功地通过一些命令行编译器魔法(类似于此处显示的)来编译和工作,以用于不同的应用程序。

但是,当尝试将 C++ 代码编译为 C# EXE 时,虽然编译和链接工作正常,但尝试运行生成的可执行文件会导致以下错误:

尝试运行项目时出错:尝试使用修复程序加载无法验证的可执行文件(IAT 具有超过 2 个部分或 TLS 部分。)(来自 HRESULT 的异常:0x80131019)

命令行基本上是:

cl /nologo /clr /Zi /MDd /DWIN32 /D_LIB /FUmanaged.dll /c interface.cpp /FoDebug\interface.obj
csc /target:module /addmodule:Debug\interface.obj /r:managed.dll App.cs MainWindow.xaml.cs Debug\MainWindow.xaml.g.cs Properties\AssemblyInfo.cs /out:Debug\Program.netmodule
link /entry:TestApp.App.Main /subsystem:Windows /clrimagetype:ijw /debug /ltcg /manifest /out:Debug\TestApp.exe Debug\App.netmodule Debug\interface.obj

有什么想法会出错吗?(managed.dll 是一个单独的 C# DLL,包含代码的两个部分所需的通用定义。我可以将它分开,它与手头的问题并没有真正的关系,但为了完整性,我已经包含了它。)

工作 DLL 版本的链接命令行基本相同,只是它/dll使用/entry: /subsystem: /clrimagetype:. 我已经尝试删除其中的每一个,只有最后一个似乎是可选的,删除它并没有帮助。

4

0 回答 0