Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# F#导致生成问题的程序集引用?_C#_Visual Studio 2012_F#_Msbuild - Fatal编程技术网

C# 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 =

我们有一个F#程序集(
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#
    AssemblyOne
    ->F#
    AssemblyTwo
    ->
    MyCSharpLib
    (C#DLL)(不生成)
  • F#
    AssemblyOne
    ->F#
    AssemblyTwo
    ->
    MyFSharpLib
    (F#DLL)(不生成)
  • F#
    AssemblyOne
    ->F#
    AssemblyTwo
    ->C#
    AssemblyTwo
    (同一解决方案中的程序集)(不生成)
  • F#
    AssemblyOne
    ->F#
    AssemblyTwo
    ->F#
    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