在编译我的项目(它是一个实现 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)
此错误意味着什么以及可能导致该错误的原因是什么?
我不是100%确定,这是我的猜测。
您正在使用 System.ServiceModel,并将其添加为项目中的引用。 ServiceModel 反过来使用 SMDiagnostics 程序集,但您没有在项目中明确引用它。 您可能正在使用 --standalone 进行编译,因此它警告您无法找到所有程序集的传递闭包?
无论如何,我希望如果您添加对 SMDiagnostics 的显式引用,警告就会消失。 无论如何,这可能是一个无害的警告(我认为 SMDiagnostics 可能在 GAC 中,因此无论如何都会在运行时找到它)。
设置 --lib 会抑制 FS2011 警告。 它有效地告诉 fsc.exe 在哪里搜索这两个 DLL 文件,以便它可以在构建时链接它们。 我们喜欢静态构建选项,因为它使我们能够将软件解压缩到新的 Windows 盒子并使其无需其他配置即可运行。
设置 FSLIB=--lib:c:\Windows\Microsoft.NET\Framework 4.0.30319
设置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 SMD诊断
解决了 F# (FSC.EXE) 编译器的以下警告
警告 FS2011:程序集“System.ServiceModel.Internals”被传递引用,并且程序集无法自动解析。静态链接将假定此 DLL 不依赖于 F# 库或其他静态链接的 DLL。考虑添加对此 DLL 的显式引用。
警告 FS2011:程序集“SMDiagnostics”被传递引用,并且无法自动解析程序集。静态链接将假定此 DLL 不依赖于 F# 库或其他静态链接的 DLL。考虑添加对此 DLL 的显式引用。