gpt4 book ai didi

c# - 如何将 F# 和 C# 程序集与 ILMerge 合并,以便在引用时所有类型都可用?

转载 作者:太空狗 更新时间:2023-10-29 23:24:33 29 4
gpt4 key购买 nike

我有一个包含许多 F# 和 C# 项目的解决方案。我的目标是使用 ILMerge 将它们全部合并到一个库中。生成的合并 dll 将放入 NuGet 包中,并在其他项目中引用。但是,在 F# 项目中引用合并的 dll 时,我遇到了一些问题。

我遇到的问题是,如果提供给 ILMerge 的主要程序集是 F#,那么在 F# 项目中引用生成的 dll 只允许访问 F# 类型。如果选择 C# dll 作为合并的主要程序集,则在 F# 项目中引用时,来自合并的 F# 程序集的扩展方法不可用。具有 AutoOpen 属性的模块在打开封闭命名空间时不再隐式打开。

有没有办法合并 F# 和 C# 程序集,以便所有类型(包括扩展方法)都可用?

最佳答案

在我们的代码库的一部分中,库的很大一部分是用 F# 完成的,其余部分是用 C# 完成的。 F# 和 C# 代码都是前置的。

我们有一个 hell 般的批处理文件来处理合并,我看到的是我们正在使用这段代码进行合并:

echo merging %mergeapp% /keyfile:"%keyfile%" /target:library /attr:"%dstpath%%csharpdll%" /targetplatform:%targetplatform%,%targetlib% /lib:%sllib% /lib:%targetlib% /lib:"%libpath%lib" /out:"%mergedpath%..\%csharpdll%" "%dstpath%%csharpdll%" "%dstpath%%fsharpdll%"
%mergeapp% /keyfile:"%keyfile%" /target:library /attr:"%dstpath%%csharpdll%" /targetplatform:%targetplatform%,%targetlib% /lib:%sllib% /lib:%targetlib% /lib:"%libpath%lib" /out:"%mergedpath%..\%csharpdll%" "%dstpath%%csharpdll%" "%dstpath%%fsharpdll%"

这就是我们想要的。但是,我们不发布任何扩展方法,也不执行任何 AutoOpen。我们发现的是 F# 编译器中的一个错误,在我们开始混淆之前,它要求我们在 F# 程序集上运行 ildasm 并删除有问题的代码。另一个问题是 F# 没有正确支持成员的 protected 修饰符(F# 使它们公开),因此我们创建了一个属性,我们可以将其卡在本应 protected 类成员上。然后我们编写了一个工具,使用 Cecil 将程序集分开,撕掉我们的属性并将对这些成员的访问权限更改为 protected (code is in the accepted answer here)。

我不知道 AutoOpen,但我必须做一个类似的任务,所以我创建了一个名为注册者的类来完成这样的工作:

type FSharpRegistrant() =
do
// do whatever I need to get going

然后在 C# 模块中的静态构造函数中,我编写了一些代码,使用反射来实例化 F# 注册者以查找类(因为在我的代码库中,C# 代码首先构建并且根本不知道有 F# 代码) .这是带有大量错误检查的丑陋代码,但它确实有效。

关于c# - 如何将 F# 和 C# 程序集与 ILMerge 合并,以便在引用时所有类型都可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915057/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com