合并多个.NET二进制文件?

7

我希望能够在C#和F#中编写程序。我有一些部分类,我想在其中定义一些F#方法。但是我遇到了一个问题:部分类不能跨越两个DLL。有没有办法将它们合并?我希望使用免费的解决方案,并且能够在正常构建过程中自动完成。

2个回答

6

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

您想做什么?

您可以在一个单独的F#库中公开方法,然后从C#类中调用这些方法。
然后,您可以使用ILMerge将两个程序集合并。


在你给这个贴踩个负之前,请注意ILMerge完全没有帮助。 - SLaks
我有一个BasicUser类,其中包含数据库连接和其他很棒的功能,例如useridFromName VerifiedUser(和管理员)。 我想在F#中编写一些函数,这些函数使用了许多这些函数(通常它们是部分类的一部分),并且我想编写F#方法,除非对我来说太复杂,否则我将在C#中编写它们,并且会损失一些开发时间。 - user34537

5
我以前听过这样的请求,所以似乎更多的人想要这样做。然而,正如已经说过的,这是不可能的。您可以使用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的类型(以及它是否存在)。
当然,这只是一个技术问题的例子,但会有很多类似的问题-你可以轻易想象出许多其他问题,如果你想支持这个功能的话(而且似乎两个编译器都需要了解对方的内部机制)。

Henk Holterman发表了评论,他认为这种方法不可行的原因还有其他方面。 - user34537

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