C# ILRepack之后,类型强制转换不再工作

C# ILRepack之后,类型强制转换不再工作,c#,interface,f#,ilrepack,C#,Interface,F#,Ilrepack,我试图从一个项目的二进制文件中创建一个可执行文件。这就是我所拥有的: 一个用F#编写的共享库dll,我将通过A 一种用C语言编写的库dll,它实现了A中的模块接口(IModule)。我将此库称为B 一种用F#编写的可执行文件,在引导时从A检测IModule接口的所有可用实现,并实例化相应的类型,B中有这样的实现。我将可执行文件称为C 所有项目都以.NET 4.0为目标;F#项目使用F#3.0(FSharp.Core 4.3.0.0),我使用的是Visual Studio 2017社区 当文件

我试图从一个项目的二进制文件中创建一个可执行文件。这就是我所拥有的:

  • 一个用F#编写的共享库dll,我将通过
    A
  • 一种用C语言编写的库dll,它实现了
    A
    中的模块接口(
    IModule
    )。我将此库称为
    B
  • 一种用F#编写的可执行文件,在引导时从
    A
    检测
    IModule
    接口的所有可用实现,并实例化相应的类型,
    B
    中有这样的实现。我将可执行文件称为
    C
所有项目都以.NET 4.0为目标;F#项目使用F#3.0(FSharp.Core 4.3.0.0),我使用的是Visual Studio 2017社区

当文件没有打包在一起时,所有逻辑都工作正常(就像从exe项目的bin/Debug目录运行一样)。当我生成合并的可执行文件(使用)时,可执行文件中的逻辑不再检测
B
中的哪些类实现
A
中的接口。特别是,我有以下支票:

if (typedefof<IModule>.IsAssignableFrom(someType)) then ...
如果(typedefof.IsAssignableFrom(someType)),那么。。。
这是
a
中的代码片段,我使用它来检测
IModule
实现。我假设ILRepack合并会导致某些类型信息在过程中丢失,从而阻止上述行工作

我用来完成这项工作的一个解决方案是从合并的exe中排除库
A
,然后将它带到一起

有没有一种方法可以让一个可执行文件继续运行,并使类型检测工作正常?我更喜欢使用与上述接口检测类似的方法,因为一旦找到所需的类型,我需要将它们转换为
IModule
,以便在代码中进一步使用它们

我的目标是将上述3个库捆绑在一个可执行文件中。但是,我还希望有其他dll文件,它们从
A
实现
IModule
,并放在可执行文件之外。这些DLL将独立于
A
B
C
开发,并且它们在合并的可执行文件中的存在将根据我的用例而有所不同。出于同样的原因,我不能让他们工作


注意,出于明显的原因,我还将FSharp.Core dll包含在打包的可执行文件中。

iRepack也在进行修剪吗?可能是这些类型除了通过反射之外没有任何其他方式使用,所以在合并时可以随意跳过它们。在反汇编程序中查看合并的二进制文件并检查它们是否仍然存在。@scrwtp,不确定是否存在,但合并的程序集大小近似于源程序集大小之和,因此我认为它不会剥离或优化它们。我要求的接口类型在合并的程序集中被积极使用,因此我怀疑它是否会被剥离