Скомпилируйте CSProj в Visual Studio с / CLR: безопасно?Неустранимая ошибка LNK1302: поддерживается только связывание безопасных модулей .net - PullRequest
1 голос
/ 18 июня 2011

Итак, у меня проблема с преобразованием проекта с открытым исходным кодом (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: поддерживается только связывание безопасных .netmodules; невозможно связать чистый .netmodule

И модуль System.Data.SQLite.net создается из проекта C # / .NET. Как я могу заставить его скомпилировать с опцией /clr:safe, так как в соответствии с MSDN это способ исправить проблему. Проблема в том, что я не знаю, как его скомпилировать с /clr:safe. Как это я могу сделать это в файле csproj или в Visual Studio где-нибудь? Если я пытаюсь это исправить, дайте мне знать лучше.

UPDATE : Итак, я определил проблему, но я не уверен, почему это проблема. Таким образом, проект взаимодействия (проект C, который компилирует sqlite-код и ссылки) использует VCLinkerTool для связи с модулем System.Data.SQLite.net. Затем существует проект C #, который создает модуль System.Data.SQLite.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, и он будет собираться и связываться должным образом. Любое понимание этого приветствуется.

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Хорошо, так что я, наконец, сузил суть проблемы, и, возможно, кто-то может пролить немного света на то, почему это так, но у меня есть приблизительное представление, почему. По сути, вы не можете иметь ссылку VCLinkerTool на .netmodules, которые были созданы с целью /platform:x86 (и я предполагаю, что любой другой вариант, который не AnyCpu. Я бы предположил, что это связано с тем, как связывание происходит внутри при связывании dll в смешанном режиме с .netmodule. Таким образом, похоже, чтобы это работало, ваш проект C # должен быть скомпилирован с /platorm:AnyCpu.

0 голосов
/ 18 июня 2011

Вы должны отредактировать CSProj, чтобы не использовать функции, из-за которых код больше не будет safe.Их легко обнаружить - в любом месте, где вы используете P / Invoke, или в любом месте, где есть кодовый блок и unsafe, этот код небезопасен.Если какой-либо код в вашей сборке небезопасен, вся сборка помечается как небезопасная.

Если вы удалите небезопасный код, результирующая сборка автоматически станет безопасной.

(В случаеSQLite Я считаю, что это будет невозможно, потому что SQLite - это библиотека C, которую нельзя скомпилировать как safe)

0 голосов
/ 18 июня 2011

Это может быть тем, что вы ищете:

Чтобы установить этот параметр компилятора в Visual Studio

1.В обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите Свойства, чтобы открыть диалоговое окно «Свойства страницы проекта».

2.Выберите папку «Свойства конфигурации».

3.На странице свойств General измените свойство поддержки Common Language Runtime.

Примечание

Если в диалоговом окне страниц свойств включен параметр / clr, свойства параметров компилятора, несовместимые с параметром / clr,также отрегулировано, как требуется.Например, если установлен / RTC, а затем / clr включен, / RTC будет отключен.

Кроме того, при отладке приложения / clr установите для свойства Тип отладчика значение Только смешанное или Управляемое.Для получения дополнительной информации см. Параметры проекта для конфигурации отладки C ++.

Для получения информации о том, как создать модуль, см. / NOASSEMBLY (Создать модуль MSIL).

...