代码之家  ›  专栏  ›  技术社区  ›  LeonZandman

使用标记为“内部”(C#)的外部程序集的接口

  •  0
  • LeonZandman  · 技术社区  · 17 年前

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

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

    我无法以任何方式编辑/更改外部部件。它应该保持不变。

    4 回复  |  直到 17 年前
        1
  •  4
  •   Jb Evain    17 年前

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

        2
  •  2
  •   Dustin Campbell    17 年前

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

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

        3
  •  1
  •   Daniel Earwicker    17 年前

    为了获得一些背景信息,您可能希望将接口实现传递给此程序集中的其他程序集,该程序集也是内部的,因为否则他们将无法编译此其他程序集(在公共方法的参数中引用内部类型是错误的)。

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

    • 使用工具拆解另一个总成 反射镜和那个很酷的addin 从 装配
    • 与另一个程序集的所有者交谈,并向他们解释您的需求
        4
  •  0
  •   Andrew Hare    17 年前

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

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

    [assembly: InternalsVisibleTo("YourAssembly")]
    

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

    推荐文章