C# 将多个.NET二进制文件合并在一起?

C# 将多个.NET二进制文件合并在一起?,c#,dll,f#,partial-classes,C#,Dll,F#,Partial Classes,我想用C和F两种语言编程。我有分部类,我想在其中的一些中定义F#方法。我得到的问题是,一个部分类不能跨越2个DLL。有什么方法可以合并它们吗?我更喜欢一个免费的解决方案,并且能够在正常的构建中自动完成。您不能用不同的语言编写类的不同部分 你想干什么 您可以在单独的F#库中公开方法,并从C#中的类调用它们。 然后可以使用ILMerge来合并这两个程序集。我已经听到这样的请求,因此似乎有更多的人希望这样做。然而,正如前面所说,这是不可能的。可以使用ILMerge合并多个程序集(具有不同的类),但不能

我想用C和F两种语言编程。我有分部类,我想在其中的一些中定义F#方法。我得到的问题是,一个部分类不能跨越2个DLL。有什么方法可以合并它们吗?我更喜欢一个免费的解决方案,并且能够在正常的构建中自动完成。

您不能用不同的语言编写类的不同部分

你想干什么

您可以在单独的F#库中公开方法,并从C#中的类调用它们。

然后可以使用ILMerge来合并这两个程序集。

我已经听到这样的请求,因此似乎有更多的人希望这样做。然而,正如前面所说,这是不可能的。可以使用ILMerge合并多个程序集(具有不同的类),但不能用不同的语言编写类的不同部分。您能得到的唯一答案是,您需要以不同的方式构造代码。有几种选择:

  • 声明一个F#模块,其函数包含要在F#中执行的部分
  • 在F#中声明具有成员的类型,然后使用C中的这些类#
  • 用C#(或F#)声明一个基类,并创建一个继承的类,该类用另一种语言添加其余的功能
在任何情况下,您都需要以某种方式解耦功能(这是技术要求,我相信这也将有助于提高代码的可读性)

要演示跨多个程序集的分部类无法工作的原因,请执行以下操作:

// C# part
partial class Foo { 
  private int csharpField;
  int Bar() { return FSharpMethod(); }
}

// F# part
type Foo =
  member x.FSharpMethod() = x.csharpField
在本例中,C#无法编译代码,因为它不知道
FSharpMethod
是否存在以及它的类型。F#编译器也无法编译代码,因为它不知道
csharpField
的类型(以及它是否存在)


当然,这只是一个技术问题的例子,但是会有很多问题-如果您想支持这一点,您可以很容易地想象会出现许多其他问题(似乎这两个编译器需要了解另一个编译器的内部结构)。

在否决这一点之前,请注意,ILMerge一点帮助都没有。我有一个BasicUser类,它具有数据库连接和其他重要功能,如useridFromName VerifiedUser(和admin)。我想在F#中使用一些函数,它们使用了很多函数(通常它们是部分类的一部分),我想在F#中编写方法,除非它对我来说太复杂了,我将在C#中执行,并且不会损失太多的开发时间。Henk Holterman中的评论还有其他原因说明这不起作用。