使用/CLR:Safe在Visual Studio中编译CSProj?致命错误LNK1302:仅支持链接安全的.netm

本文关键字:LNK1302 致命错误 支持 安全 netm 链接 编译 Safe CLR Visual 使用 | 更新日期: 2023-09-27 17:59:22

所以我在转换开源项目(SQLite)以使用不同的构建系统时遇到了问题,现在我在链接项目时遇到了困难。本质上,我有一个VCProj文件,它的定义如下:

<Tool
   Name="VCLinkerTool"
   AdditionalOptions="/ASSEMBLYRESOURCE:..'System.Data.SQLite'SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp&#x0D;&#x0A;/ASSEMBLYRESOURCE:..'System.Data.SQLite'SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp&#x0D;&#x0A;/ASSEMBLYRESOURCE:..'System.Data.SQLite'SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp"
   AdditionalDependencies="..'System.Data.SQLite'bin'System.Data.SQLite.netmodule"
   OutputFile="..'bin'System.Data.SQLite.DLL"
   GenerateManifest="false"
   IgnoreDefaultLibraryNames=""
   ModuleDefinitionFile="src'sqlite3.def"
   EmbedManagedResourceFile=""
   DelayLoadDLLs="advapi32.dll"
   RandomizedBaseAddress="1"
   DataExecutionPrevention="0"
   ImportLibrary=""
   KeyFile="..'System.Data.SQLite'System.Data.SQLite.snk"
   CLRUnmanagedCodeCheck="true"
/>

由于以下错误,我无法正确链接System.Data.SQLite.net模块:

正在链接
4> 。。''System.Data.SQLite''bin''System.Data.SQLite.netmodule:致命错误LNK1302:仅支持链接安全的.netmodule;无法链接纯.netmodule

System.Data.SQLite.NET模块是从C#/.NET项目中生成的。这是怎么回事?我可以强迫它使用/clr:safe选项进行编译,因为根据MSDN的说法,这是解决问题的方法。问题是我不知道如何用/clr:safe编译它。我怎么能在csproj文件或visual studio的某个地方做到这一点?如果我在尝试解决这个问题时偏离了底线,请告诉我一个更好的方法。

更新:所以我已经确定了这个问题,但我不确定为什么它是一个问题。因此,interop项目(编译sqlite代码和链接的C项目)使用VCLinkerTool链接到System.Data.sqlite.net模块。然后有一个C#项目使用以下命令创建System.Data.SQL ite.net模块(添加{}中的任何内容以缩短长度):

C:'Windows'Microsoft.NET'Framework'v3.5'Csc.exe /noconfig /unsafe- /nowarn:1701,1702 /platform:AnyCPU /errorreport:prompt /doc:..'bin'System.Data.SQLite.XML {DLL REFEERENCFES /debug- /filealign:512 /optimize+ /out:obj'Release'System.Data.SQLite.netmodule {RESOURCES AND CS FILES}

问题出在/platform:AnyCPU上。在我的构建中,它是/platform:x86,由于某种原因,这会导致链接时出现问题,我不确定为什么,但这就是我将其缩小到的范围,因为我可以将其更改为AnyCPU,它将正确构建和链接。对此有任何见解,我们将不胜感激。

使用/CLR:Safe在Visual Studio中编译CSProj?致命错误LNK1302:仅支持链接安全的.netm

好的,所以我最终缩小了问题的范围,也许有人可以进一步了解原因,但我大致知道原因。基本上,你不能让VCLinkerTool链接到针对/platform:x86创建的.netmodule(我认为任何其他变体都不是AnyCpu。我认为这与将混合模式dll与.netmodule链接时内部发生链接的方式有关。因此,要想实现这一点,你必须用/platorm:AnyCpu编译C#项目。

这可能就是您想要的:

在Visual Studio 中设置此编译器选项

1。在解决方案资源管理器中,右键单击项目名称,然后单击"属性"打开项目"属性页"对话框。

2。选择"配置属性"文件夹。

3。在"常规"属性页上,修改"公共语言运行时支持"属性。

票据

当在"属性页"对话框中启用/clr时,与/clr不兼容的编译器选项属性也会根据需要进行调整。例如,如果设置了/RTC,然后启用了/clr,则/RTC将关闭。

此外,在调试/clr应用程序时,请将Debugger Type属性设置为Mixed或Managed only。有关详细信息,请参阅C++调试配置的项目设置。

有关如何创建模块的信息,请参阅/NOASSEMBLY(创建MSIL模块)。

您必须编辑CSProj才能不使用导致代码不再是safe的功能。这些很容易发现——在任何使用P/Invoke的地方,或者在任何有unsafe代码块的地方,该代码都是不安全的。如果程序集中的任何代码不安全,则整个程序集将被标记为不安全。

如果删除不安全的代码,生成的程序集将自动安全。

(对于SQLite,我认为这是不可能的,因为SQLite是一个C库,不能编译为safe