我发现在.NET Core中使用DLL的一个有趣的问题(.NET Framework工作正常)。 MVCE如下:
使用以下单个文件创建一个F#(语言无关).NET Core类库(特定代码也不相关):
namespace FSharpClassLibrary
module Say =
let hello name =
printfn "Hello %s" name
使用以下代码在单独的解决方案中创建一个C#.NET Core类库 (非常重要 - 如果它们都在同一个解决方案中,它完全有效):
namespace CSharpClassLibrary
{
public class HelloClass
{
public void Hello(string name)
{
FSharpClassLibrary.Say.hello(name);
}
}
}
此外,添加文件夹dlls
,将FSharpClassLibrary.dll
复制/粘贴到其中,并将其添加为项目的引用(否则,上述文件将无法编译)。将.dll
移动到项目中实际上并不重要,但由于我正在独立于第一个项目分发第二个项目,因此我需要保证DLL可用。
最后,使用以下文件将控制台应用程序添加到与CSharpClassLibrary
相同的解决方案中:
using System;
using CSharpClassLibrary;
namespace ConsoleApp1
{
public class Main1
{
public static void Main()
{
new HelloClass().Hello("test");
#if DEBUG
Console.Write("Press any key");
Console.ReadKey();
#endif
}
}
}
最后,进入NuGet并将FSharp.Core
版本4.3.4添加到两个C#项目中(只是为了确保所有内容都可以访问F#语言的东西;如果使用C#创建第一个类库则没有必要)。另外,我使用的是VS 15.6;这可能也可能不相关。
将控制台应用程序设置为启动项目并运行它。您将收到以下错误:
System.IO.FileNotFoundException:无法加载文件或程序集'FSharpClassLibrary,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'。该系统找不到指定的文件。 文件名:'FSharpClassLibrary,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null' 在ClassLibrary1.Facade.Hello1.Hello(String name) 在C:\ Users \ *** \ source \ ConsoleApp1 \ ConsoleApp1 \ Main.cs:第11行的ConsoleApp1.Main1.Main()中
最奇怪的是,如果我绕过CSharpClassLibrary
库并在FSharpClassLibrary.dll
项目中托管HelloClass.cs
和ConsoleApp1
,那么一切都按预期进行。如果我使用两个C#DLL就会出现同样的问题,我使用了F#,因为这就是我正在使用的。
我已经尝试过:
FSharpClassLibrary.dll
以及ConsoleApp1
中的孩子(CSharpClassLibrary.dll
)。obj
文件夹中的.dll而不是bin
文件夹(据我所知,这应该无关紧要)。FSharpClassLibrary.dll
的{{1}}文件夹中存在ConsoleApp1
。