Предупреждение о компиляции FSC: сборка "SMDiagnostics" была переходной, и сборка не может быть разрешена автоматически
Периодически при компиляции моего проекта (это консольное приложение, реализующее службу Windows) выдается вышеупомянутое предупреждение.
(здесь полный текст предупреждения)
Warning 1 Assembly 'SMDiagnostics' was referenced transitively and the assembly could not be resolved automatically.
Static linking will assume this DLL has no dependencies on the F# library or other statically linked DLLs. Consider adding an explicit reference to this DLL.
FSC 1 1 myService (Applications\myService\myService)
Что означает эта ошибка и что может быть ее причиной?
2 ответа
Я не уверен на 100%, вот мое предположение.
Вы используете System.ServiceModel и добавили его в качестве ссылки в свой проект.ServiceModel, в свою очередь, использует сборку SMDiagnostics, но в вашем проекте на нее явно не ссылаются. Возможно, вы компилируете с --standalone, и поэтому он предупреждает вас о невозможности найти транзитивное замыкание всех сборок?
В любом случае, я ожидаю, что если вы добавите явную ссылку на SMDiagnostics, предупреждение исчезнет. В любом случае, это, вероятно, безобидное предупреждение (я думаю, что SMDiagnostics, вероятно, находится в GAC, поэтому он будет найден во время выполнения независимо).
Установка --lib подавляет предупреждение FS2011. Он эффективно сообщает fsc.exe, где искать два файла DLL, чтобы связать их во время сборки. Нам нравится опция статической сборки, потому что она позволяет нам разархивировать наше программное обеспечение в новую коробку Windows и запустить его без какой-либо другой настройки.
set FSLIB = - lib: c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
set compileFlags = - debug: full --standalone --optimize + --crossoptimize + --tailcalls +% FSLIB%
fsc% compileFlags% MyFSharpProgram.fsx
Вместо переменных среды вы можете просто добавить следующее в вашу команду компиляции. --lib:c:\Windows\Microsoft.NET\Framework\v4.0.30319
Вам нужно будет заменить любой каталог, содержащий необходимую DLL, на тот, который мы использовали. Я использовал команду cygwin find, запущенную от имени администратора, чтобы найти каталог.
находить. | grep SMDiagnostics
Разрешены следующие предупреждения от компилятора F# (FSC.EXE)
предупреждение FS2011: сборка "System.ServiceModel.Internals" была сделана транзитивно, и сборка не может быть разрешена автоматически. Статическое связывание предполагает, что эта DLL не имеет зависимостей от библиотеки F# или других статически связанных DLL. Попробуйте добавить явную ссылку на эту DLL.
предупреждение FS2011: сборка "SMDiagnostics" была связана транзитивно, и сборка не может быть разрешена автоматически. Статическое связывание предполагает, что эта DLL не зависит от библиотеки F# или других статически связанных DLL. Попробуйте добавить явную ссылку на эту DLL.