【问题标题】:Use an interface from an external assembly that's marked as "internal" (C#)使用标记为“内部”的外部程序集的接口 (C#)
【发布时间】:2010-10-14 23:26:18
【问题描述】:

我想实现一个驻留在外部程序集中的接口。但是,该特定接口已被标记为“内部”。有没有办法我仍然可以为我自己的类实现这个接口?

我知道如何在 C# 中使用反射调用私有/内部方法,所以我想在这种情况下也应该使用反射。但是,我不知道怎么做。是的,我知道使用内部/私人的东西通常是不明智的,但在这种情况下,我看不到其他解决方案。

更新:我无法以任何方式编辑/更改外部程序集。它应该保持不变。

【问题讨论】:

    标签: c# .net reflection interface


    【解决方案1】:

    您不能这样做,除非您可以更改包含接口的程序集以添加InternalsVisibleToAttribute,以您自己的程序集为目标。

    【讨论】:

    • 我不想以任何方式编辑/更改外部程序集。我已经更新了问题。
    • 所以你很高兴:)
    • 一些棘手的解决方案将涉及使用 Cecil 修补原始程序集,如果程序集已签名,请停用其强名称检查,但这不是我推荐的路径 :)
    • 我也不想那样做。奇怪的是,可以毫无问题地调用私有/内部方法,但不能实现那些内部接口。
    【解决方案2】:

    使用外部程序集中的 InternalsVisibleToAttribute 指向要向其公开内部类型的程序集。

    http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

    【讨论】:

      【解决方案3】:

      只是为了获得一些背景知识,大概你想将接口实现传递给这个程序集中的其他东西,这也是内部的,因为否则他们将无法编译这个其他程序集(引用它是一个错误到公共方法参数中的内部类型)。

      我认为你必须使用 Reflection.Emit 来构建一个实现接口的类型,通过反射获得接口的 Type 对象。这不是一项简单的任务,而且结果会很脆弱,因为您正在挖掘其他人的程序集的内部。

      其他选项:

      • 拆卸另一个组件,使用 反射器和那个很酷的插件 从 组装。
      • 与其他程序集的所有者交谈并说明您的需求 他们

      【讨论】:

      • 是的,我已经在研究 Reflection.Emit。有趣的东西:-)
      • 你不能使用reflection.emit来实现私有接口,你会得到一个TypeLoadException。
      【解决方案4】:

      如果您有外部程序集的源代码,那么您可以使用指向您的程序集的InternalsVisibleTo 属性对其进行编译。这不是一个完美的解决方案,我经常将它用于单元测试而不是生产代码,但它可能值得一看。

      基本上,您需要做的就是将以下内容添加到项目中的 AssemblyInfo.cs 代码文件中:

      [assembly: InternalsVisibleTo("YourAssembly")]
      

      如果YourAssembly 是强命名的,那么您必须输入程序集的完全限定名称,包括整个公钥(不仅仅是令牌)。

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        相关资源
        最近更新 更多