生成从C#DLL到Mono的元数据(“绑定”库)

时间:2013-04-27 12:51:33

标签: c# .net binding mono wrapper

我有一个针对Windows 8的C#库项目。

我想构建一个与 tblimp 的行为类似的工具:

  1. 浏览库中的所有公共类型(DLL)。
  2. 将这些导出到新的“包装器”DLL中(虽然可以配置此行为,但方法体将保留为空白。)
  3. 新生成的DLL可以在其他不支持原始DLL的项目中引用(仅仅是为了构建项目,因为这些方法本身不包含任何功能)。

    主要好处是使用生成的DLL作为Mono项目的参考。

    是否有任何工具允许这样做?

3 个答案:

答案 0 :(得分:1)

我认为如果你可以使用Mono.Cecil来解析原始的dll(如果在某些极端情况下你可能需要修补Cecil,它就失败了)。然后使用内存中的对象,可以生成磁盘所需的任何程序集,并将生成的程序集用于您的目的。

有许多基于Cecil的开源项目可以引导您走上这条道路,例如Obfuscar(开源混淆器),

http://obfuscar.codeplex.com/

答案 1 :(得分:0)

我现在正在做同样的事情 - 我正在创建一个名为Piranha的工具,它删除所有代码,所有非公共成员只留下一个“骨架”。 要使生成的库CLS兼容并不容易。 构造函数存在问题:构造函数需要调用基类型构造函数。但是如果它调用的构造函数是内部的呢? 结构存在问题:看起来你不能只删除所有私有字段,因为需要知道结构的大小(对于可验证的程序集)。

但是创建一个骨架库是不够的。您还需要重新映射/删除引用。您的Windows 8库引用了WinRT库,Mono库不会使用它。你必须用一些配置文件替换最有可能的PCL引用的WinRT库引用。我还没有完成这部分。

还有其他引用的库。他们将使用它们拖动特定于平台的引用。因此,我们需要删除这些引用(以及依赖于这些库中的类型的所有成员)或将库转换为骨架(并重新映射引用)。

如果您对此类工具感兴趣,我会在几天内创建一个GitHub仓库并在那里发布代码。

答案 2 :(得分:0)

此工具已存在。它随早期版本的.NET框架一起提供。它被称为“SoapSuds。”

https://support.microsoft.com/en-us/kb/323491