3 回答
TA贡献1833条经验 获得超4个赞
我只看到一种情况,您可以将内部成员暴露给另一个程序集,这是出于测试目的。
说有一种方法可以允许“朋友”程序集访问内部:
在项目的AssemblyInfo.cs文件中,为每个程序集添加一行。
[assembly: InternalsVisibleTo("name of assembly here")]
希望这可以帮助。
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"))
// });
}
- 3 回答
- 0 关注
- 494 浏览
添加回答
举报