C# F#导致生成问题的程序集引用?
我们有一个F#程序集(C# F#导致生成问题的程序集引用?,c#,visual-studio-2012,f#,msbuild,C#,Visual Studio 2012,F#,Msbuild,我们有一个F#程序集(AssemblyOne),它在单个Visual Studio 2012解决方案中引用另一个F#程序集(AssemblyTwo)AssemblyTwo引用了一个C#DLL(MyCSharpLib) AssemblyOne中定义的函数调用AssemblyTwo中定义的函数: namespace AssemblyOne [<RequireQualifiedAccess>] module MyModuleA = let FetchResult id =
AssemblyOne
),它在单个Visual Studio 2012解决方案中引用另一个F#程序集(AssemblyTwo
)AssemblyTwo
引用了一个C#DLL(MyCSharpLib
)
AssemblyOne
中定义的函数调用AssemblyTwo
中定义的函数:
namespace AssemblyOne
[<RequireQualifiedAccess>]
module MyModuleA =
let FetchResult id =
let result = AssemblyTwo.MyModuleC.FetchResult id
result
解决方案在VisualStudio中编译和构建;但是,当我们尝试使用MSBuild从命令行生成项目时,生成失败,MSBuild.log中出现以下错误:
error FS0074: The type referenced through 'MyCSharpLib' is defined in an assembly that is not referenced. You must add a reference to assembly 'MyCSharpLib'.
在AssemblyTwo
中的FetchActualResult()
函数签名中,显示为MyCSharpLib
中的参数的类型导致了错误。
AssemblyOne
现在需要引用MyCSharpLib
,即使AssemblyOne
不直接使用MyCSharpLib
中的任何内容。
如果我们从函数签名中删除参数,那么解决方案将生成,不会出现错误
通过使用以下用例复制代码(“->”表示程序集引用),我们进一步探讨了这个问题:
- F#
->F#AssemblyOne
->AssemblyTwo
(C#DLL)(不生成)MyCSharpLib
- F#
->F#AssemblyOne
->AssemblyTwo
(F#DLL)(不生成)MyFSharpLib
- F#
->F#AssemblyOne
->C#AssemblyTwo
(同一解决方案中的程序集)(不生成)AssemblyTwo
- F#
->F#AssemblyOne
->F#AssemblyTwo
(在同一解决方案中组装)(构建)AssemblyTwo
可以解释这种行为吗?假设您的源代码中有DWright指出的输入错误,我想说,这个错误可能是因为您通过这段代码定义了一个静态类MyModuleB,其中公开了外部类型MyCsharpType的方法参数 这是Fsharp代码转换为IL的方式(从ILSpy-重新转换为Csharp): 如果不公开该类型以使其静态可见,则可能不会出现错误。然而,这取决于编译器的实现 我可以想象,在编译MyModuleA的过程中,一个编译过程的配置或编译器的版本可以尝试“接触”MyModuleB,从而尝试达到未引用的参数类型,而另一个可能只是不接触MyModuleB。视情况而定
因此,在我看来,问题似乎不在编译过程中,而是在事实上,您公开了一个类型的用法,而您没有引用它的程序集。我刚才用这种方式解决了一个类似的问题。试试这个 在MyModuleC的末尾,添加以下行:
let fetchResult = FetchResult
然后,在MyModuleA中,调用fetchResult而不是fetchResult。当然有争论
是的,我知道这听起来很傻,但一定要试试。我相信这将打破不必要的依赖
如果使用C#as中的AssemblyTwo,则可能不会出现此问题。当你从F#中使用AssemblyTwo时,它就会显现出来,所以我想知道F#编译器是否有问题,或者它可能与我无法理解的currying有关。无论如何,我希望F#编译器更聪明。也许有人应该提交一个问题,除非它已经完成了。我不确定是什么导致了这一问题,但通常您可以检查:(1)它们是否都引用了相同版本的
FSharp.Core.dll
?(2) 它们是为相同的目标框架编译的吗?(1)它们都引用了相同版本的FSharp.Core.dll
-version 4.3.0.0和(2)所有程序集目标框架v4.5是否确实使用了与VS相同的MSBuild版本?能否在某个位置发布完整的MSBuild日志?两者都在使用ToolsVersion=“4.0”。VS和MSBuild都可以使用VS2013很好地编译程序集。
...
public static class MyModuleB
{
public static string FetchActualResult(MyCSharpType myCSharpType, int id)
{
return myCSharpType.Fetch(id);
}
}
let fetchResult = FetchResult