2014-12-10 1 views
0

Mono Cecil을 사용하여 DLL을 조작하려고합니다. 내가 원하는 것은 클래스의 기본 유형을 System.MarshalByRefObject에서 mscorlib.dll으로 설정하는 것입니다. 다음 코드를 사용하고 있습니다.Mono Cecil을 사용하여 형식의 기본 클래스를 설정할 수 없습니다.

var assembly = AssemblyDefinition.ReadAssembly(inputtarget); 
var types = assembly.MainModule.Types; 
var myTypesToChange = types.Where(...).Select(t => t); 
var baseType = AssemblyDefinition.ReadAssembly(@"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll").MainModule.Types.Where(t => t.Name.Contains("MarshalByRefObject")).Select(t => t).First(); 
foreach (var myType in myTypesToChange) 
{ 
    myType.BaseType = baseType; 
} 
assembly.Write(outputtarget); 

출력에서 ​​기본 유형이 설정되지 않았습니다!

기존 조립품에서 BaseTypeTypeReference으로 설정하면 올바르게 기본 유형이 설정됩니다.

나는 내가 할 것은 코드 프로젝트 기사 "Reweaving IL code with Mono.Cecil"에 대한 코멘트에 this reply에서 제안이 수행되는 방식과 매우 유사하다고 생각 :

"예, 당신이 어떤의 기본 유형을 다시 작성할 수 있습니다 클래스 : "

var assembly = AssemblyDefinition.ReadAssembly(AssemblyPath); 
var mainModule = assembly.MainModule; 

var companyType = mainModule.Types.First(t => t.Name == "Company"); 
var ownerType = mainModule.Types.First(t => t.Name == "Owner"); 

ownerType.BaseType = companyType; 
assembly.Write(AssemblyPath); 

이 쉬워야한다! 내가 뭘 잘못하고 있니?

+0

내가 관련 질문 벤이 요구하고 있다는 것을 깨닫게 : 나는 MarshalByRefObject를위한 TypeReference이 더 우아한 방식으로 추출 할 수 있다고 생각 http://stackoverflow.com/questions/22911825/how-do-i-change- - basetype-define-in-a-typedefinition? rq = 1 .. 제발 도와주세요 !!!! – simpleusr

+0

귀하가 주장하는 바에 따라 이전에 동일한 질문이있는 경우, 귀하의 질문은 복제본이므로 닫아야합니다. – stakx

답변

2

문제는 어셈블리 메타 데이터가 고려되지 않는다는 것입니다. 각 어셈블리에는 어셈블리 참조 및 유형 용도와 관련된 정보가 들어있는 메타 데이터가 있습니다. 대신에 새로운 기본 클래스의 생성자를 호출하도록 변경 한

var assembly = assemblyDef.AssemblyDefinition; 
var types = assembly.MainModule.Types; 
var myTypesToChange = types.Select(t => t); 
var baseType = AssemblyDefinition.ReadAssembly(@"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll").MainModule.Types.Where(t => t.Name.Contains("MarshalByRefObject")).Select(t => t).First(); 
foreach (var myType in myTypesToChange) 
{ 
    myType.BaseType = mainModule.Import(baseType); 
} 
메타 데이터 확장 외에

, 생성자의 CIL 코드 :

당신이해야 할 일은 mainModule에서 MarshalByRefObject에서 유형을 가져 오는 것입니다 원래의

마지막으로 제안 사항입니다.

var baseType = mainModule.Import(typeof (MarshalByRefObject)); 
for (...) 
{ 
    myType.BaseType = baseType; 
}