解决同时使用C#和F#的项目的循环引用

所以这是我的情况。 我在C#中有一个类库。 它公开了一些像Rectangle这样的类型。 它还公开了一些进行算法计算的方法。

在F#中编写这些算法位似乎是个好主意。 所以我在解决方案中添加了另一个F#库项目。

现在这是问题所在。 为了让F#项目进行算法计算,需要了解C#项目中的Rectangle 。 为了使C#项目能够使用F#函数,它需要引用F#项目。 所以有循环参考。

一种可能的解决方案是建立第三个项目,我可以在其中定义Rectangle ,然后从F#和C#引用该项目,然后从C#引用F#项目,这样我就可以使用这些函数了。

这个问题是我的库的用户不仅要引用我的C#项目,还要引用额外的第三个项目(因为使用需要为算法提供输入)。

这是不可接受的,因为使用F#只是一个实现细节,我不希望它在我的库使用方式上有任何开销。

所以我们假设Rectangle保留在C#项目中。 算法的F#实现(C#中调用函数的方法)的“接口”也在C#项目中。 如何将其全部链接以便它可以正常工作? 还有其他选择吗?

我拒绝循环引用似乎很奇怪。 像这样的紧密绑定的项目实际上没有有向图结构。

我知道有一个额外的方法。 F#项目有自己的Rectangle ,然后在两端进行序列化和反序列化。 这既乏味又与最初使用F#使我的代码更简单的想法相反。

听起来你真正的问题不是依赖本身,而是关注’打包’(必须运送三个程序集并且需要最终用户链接到多个程序集。)在这些情况下,您可以考虑使用ILMerge将程序集合并到一个DLL中。 这允许您在项目中使用正确的解耦,同时仍然可以方便地为库提供单个文件。 这是第三方库供应商常用的策略。

还有各种商业工具可用于执行此过程并执行其他操作,如混淆,许可证执行等,但目前尚不清楚这对您的应用程序是否真的有必要。

这里你真正的问题不是真正的C#/ F#(虽然它会触发它),但是程序集A不能从另一个程序集B重新导出类型而不要求A用户也接受对B的引用。

我建议通过在F#程序集中定义Rectangle来解决这个问题,但是在C#程序集中将新的Rectangle定义为包装类型,并将F# Rectangle作为私有成员。 然后,您可以使用包装函数公开底层F#算法,并提供用于调用代码以直接使用的构造函数。