FSC编译警告:程序集“SMDiagnostics”被过度引用,无法自动解决程序集

时间:2011-09-01 15:36:37

标签: compiler-construction f# compiler-warnings fsc

在编译我的项目时(它是一个实施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 个答案:

答案 0 :(得分:5)

我不是百分百肯定,这是我的猜测。

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

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

答案 1 :(得分:0)

设置--lib会抑制FS2011警告。它有效地告诉fsc.exe在哪里搜索两个DLL文件,以便它可以在构建时链接它们。我们喜欢静态构建选项,因为它使我们的目标是能够将我们的软件解压缩到新的Windows框并让它在没有其他配置的情况下运行。

  

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

Joe E