FSC 编译警告:程序集“SMDiagnostics”被传递引用,且程序集无法自动解析

问题描述 投票:0回答:2

在编译我的项目(它是一个实现 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)

此错误意味着什么以及可能导致该错误的原因是什么?

f# compiler-warnings fsc
2个回答
5
投票

我不是100%确定,这是我的猜测。

您正在使用 System.ServiceModel,并将其添加为项目中的引用。 ServiceModel 反过来使用 SMDiagnostics 程序集,但您没有在项目中明确引用它。 您可能正在使用 --standalone 进行编译,因此它警告您无法找到所有程序集的传递闭包?

无论如何,我希望如果您添加对 SMDiagnostics 的显式引用,警告就会消失。 无论如何,这可能是一个无害的警告(我认为 SMDiagnostics 可能在 GAC 中,因此无论如何都会在运行时找到它)。


1
投票

设置 --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 的显式引用。

乔E

© www.soinside.com 2019 - 2024. All rights reserved.