4

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

这个错误是什么意思,什么可能导致它?

4

2 回答 2

5

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

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

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

于 2011-09-01T18:15:20.220 回答
0

设置 --lib 会抑制 FS2011 警告。它有效地告诉 fsc.exe 在哪里搜索这两个 DLL 文件,以便它可以在构建时链接它们。我们喜欢静态构建选项,因为它使我们能够将我们的软件解压缩到一个新的 windows 盒子并让它运行而无需其他配置。

设置 FSLIB=--lib:c:\Windows\Microsoft.NET\Framework\v4.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 SMDiagnostics

解决了来自 F# (FSC.EXE) 编译器的以下警告

警告 FS2011:程序集“System.ServiceModel.Internals”被传递引用,无法自动解析程序集。静态链接将假定此 DLL 不依赖于 F# 库或其他静态链接的 DLL。考虑添加对此 DLL 的显式引用。

警告 FS2011:程序集“SMDiagnostics”被传递引用,无法自动解析程序集。静态链接将假定此 DLL 不依赖于 F# 库或其他静态链接的 DLL。考虑添加对此 DLL 的显式引用。

乔·E

于 2013-04-11T23:53:32.790 回答