为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕尼黑的夜晚无繁华 2019-10-28 14:14:42
有一个我无法修改的程序集(供应商提供),该程序集的方法返回对象类型,但实际上是内部类型。如何从程序集中访问对象的字段和/或方法?请记住,我无法修改供应商提供的程序集。本质上,这就是我所拥有的:来自供应商:internal class InternalClass  public string test;end classpublic 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  }}
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

我只看到一种情况,您可以将内部成员暴露给另一个程序集,这是出于测试目的。


说有一种方法可以允许“朋友”程序集访问内部:


在项目的AssemblyInfo.cs文件中,为每个程序集添加一行。


[assembly: InternalsVisibleTo("name of assembly here")]


希望这可以帮助。


查看完整回答
反对 回复 2019-10-28
?
森林海

TA贡献2011条经验 获得超2个赞

我想说一点-您不能扩充原始程序集-使用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"))

   // });

}


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 494 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信