【问题标题】:Generating metadata ("bindings" library) from C# DLL to Mono从 C# DLL 生成元数据(“绑定”库)到 Mono
【发布时间】:2013-04-27 12:51:33
【问题描述】:

我有一个面向 Windows 8 的 C# 库项目。

我想构建一个类似于 tblimp 的工具:

  1. 查看库 (DLL) 中的所有公共类型。
  2. 将这些导出到新的“包装”DLL 中(方法体将留空,尽管可以配置此行为)。

新生成的 DLL 可以在不支持原始 DLL 的其他项目中引用(只是为了构建项目,因为方法本身不包含任何功能)。

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

是否有任何工具可以做到这一点?

【问题讨论】:

  • 原始 DLL 是 .NET-DLL 还是其他类型的 DLL?哪些项目是不能引用原始DLL的?它们是 .NET 项目还是其他类型的项目?
  • 我想获取一个 Windows Store 库 DLL (C#) 并包装它的所有代码,以便可以从 Mono 中引用它。

标签: c# .net binding mono wrapper


【解决方案1】:

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

有很多基于 Cecil 的开源项目可以引领你走这条路,比如 Obfuscar(一种开源混淆器),

http://obfuscar.codeplex.com/

【讨论】:

    【解决方案2】:

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

    但是创建一个骨架库是不够的。您还需要重新映射/删除引用。您的 Windows 8 库引用 WinRT 库,不会被 Mono 库使用。您必须将 WinRT 库引用替换为很可能是某个配置文件中的 PCL 引用。这部分我还没做。

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

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

    【讨论】:

    • 我很确定我们都出于不同的原因这样做......你有什么用这样的工具/
    【解决方案3】:

    此工具已存在。它附带早期版本的 .NET 框架。它被称为“肥皂泡”。

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

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 2013-07-25
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多