猿问

如何从外部程序集访问内部类?

有一个我无法修改的程序集(供应商提供),该程序集的方法返回对象类型,但实际上是内部类型。


如何从程序集中访问对象的字段和/或方法?


请记住,我无法修改供应商提供的程序集。


本质上,这就是我所拥有的:


来自供应商:


internal class InternalClass

  public string test;

end class


public class Vendor

  private InternalClass _internal;

  public object Tag {get{return _internal;}}

end class

从我的装配中使用供应商装配。


public class MyClass

{

  public void AccessTest()

  {

    Vendor vendor = new Vendor();

    object value = vendor.Tag;

    // Here I want to access InternalClass.test

  }

}


慕尼黑的夜晚无繁华
浏览 495回答 3
3回答

潇潇雨雨

我只看到一种情况,您可以将内部成员暴露给另一个程序集,这是出于测试目的。说有一种方法可以允许“朋友”程序集访问内部:在项目的AssemblyInfo.cs文件中,为每个程序集添加一行。[assembly: InternalsVisibleTo("name of assembly here")]希望这可以帮助。

森林海

我想说一点-您不能扩充原始程序集-使用Mono.Cecil可以注入[InternalsVisibleTo(...)]3pty程序集。请注意,这可能会涉及法律问题-您可能会混淆3pty程序集和技术方面的含义-如果程序集具有很强的名称,则需要将其剥离或使用其他密钥对其重新签名。 Install-Package Mono.Cecil和类似的代码:static readonly string[] s_toInject = {  // alternatively "MyAssembly, PublicKey=0024000004800000... etc."  "MyAssembly"};static void Main(string[] args) {  const string THIRD_PARTY_ASSEMBLY_PATH = @"c:\folder\ThirdPartyAssembly.dll";   var parameters = new ReaderParameters();   var asm = ModuleDefinition.ReadModule(INPUT_PATH, parameters);   foreach (var toInject in s_toInject) {     var ca = new CustomAttribute(       asm.Import(typeof(InternalsVisibleToAttribute).GetConstructor(new[] {                      typeof(string)})));     ca.ConstructorArguments.Add(new CustomAttributeArgument(asm.TypeSystem.String, toInject));     asm.Assembly.CustomAttributes.Add(ca);   }   asm.Write(@"c:\folder-modified\ThirdPartyAssembly.dll");   // note if the assembly is strongly-signed you need to resign it like   // asm.Write(@"c:\folder-modified\ThirdPartyAssembly.dll", new WriterParameters {   //   StrongNameKeyPair = new StrongNameKeyPair(File.ReadAllBytes(@"c:\MyKey.snk"))   // });}
随时随地看视频慕课网APP
我要回答