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

时间:2009-03-23 13:43:03

标签: c# .net reflection interface

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

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

其他选择:

  • 使用,拆卸另一个组件 反射器和那个很酷的插件 从中构建整个项目 组件。
  • 与其他大会的主人交谈并解释您的需求 它们

答案 3 :(得分:0)

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

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

[assembly: InternalsVisibleTo("YourAssembly")]

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