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

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

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

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

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

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

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

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

我认为你必须使用Reflection.Emit构建一个实现接口的类型,通过reflection获得接口的Type对象。 这不是一个简单的任务,结果将是脆弱的,因为你正在挖掘别人的集会的内部。

其他选择:

  • 使用Reflector和从组件构建整个项目的酷插件拆卸另一个组件。
  • 与另一个组件的所有者交谈并向他们解释您的需求

我有外部程序集的源代码,然后您可以使用指向程序集的InternalsVisibleTo属性编译它。 这不是一个完美的解决方案,我经常将它用于unit testing而不是生产代码,但它可能值得一看。

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

 [assembly: InternalsVisibleTo("YourAssembly")] 

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