FSC编译警告:程序集'SMDiagnostics'被间接引用,但程序集无法自动解析。

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)

这个错误是什么意思,可能是什么原因造成的?
2个回答

5

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

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

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


的确,我正在使用独立选项进行编译。我明天会尝试一下并告诉你结果。 - Henrik K
这个方法可行,从GAC_MSIL中添加了SMDiagnostics.dll后,警告消失了。非常感谢! - Henrik K

1

使用 --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 命令来查找该目录。

find . | grep SMDiagnostics

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

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

Joe E


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接