큰 그림에서 주 도메인의 dll에서 메서드를 실행하려고하지만 그 후 해당 dll을 언로드합니다. 지금까지 나는 Assembly
\ dll을 새로로드 한 AppDomain
을 작성했으며 MarshalByRefObject
I는 본체를 가져 왔으며 MaxStackSize
이라는 기본 도메인에 메소드 DynamicMethod
을 작성하고 내부에 본문을 다시 작성하여 호출했습니다. 하지만 호출 할 때 예외가 발생합니다. System.BadImageFormatException: Signature is not IMAGE_CEE_CS_CALLCONV_LOCAL_SIG
.다른 AppDomain의 어셈블리에서 메서드를 복사하고 CurrentDomain에서 실행
가져와 그것을 호출하는 코드 :
DynamicMethod method = new DynamicMethod("func", typeof(void), new Type[ 0 ]);
var info = method.GetDynamicILInfo();
info.SetCode(marshal.GetILCode(), marshal.GetMaxStackSize());
info.SetLocalSignature(
SignatureHelper.GetMethodSigHelper(CallingConventions.Standard, typeof(void)).GetSignature());
method.Invoke(null, new object[ 0 ]); //<-- exception here
marshal
유형 Proxy의 개체입니다. 해야 할 수도 있습니다 일부 노트 :
- 내가 \의 호출을 가져 오는 오전 방법은
public static void Run();
입니다. - 메서드를 호출하려는
AppDomain
과 DLL \ assembly를로드하는AppDomain
은 동일한 참조를 갖습니다.
편집
는 I는 GetSignature
0x07
방법에서 상기 첫 번째 바이트를 변경하여 서명을 고정. 그러나 System.InvalidProgramException: Common Language Runtime detected an invalid program.
다른 appdomain에서 메소드를 호출 할 수없는 이유는 무엇입니까? 코드 조각을 추출 할 수는 없습니다. 그것이 무엇에 달려 있는지 누가 압니까? 그것은 확실히 포함하는 어셈블리의 메타 데이터 테이블에 정확한 토큰 값에 따라 달라집니다. – usr
@usr'AppDomain'을 언로드 한 후에도 코드가 새로운 객체를 생성해야하기 때문에 필요합니다. 그것은 그 dll 안에있는 것들에 의존하지 않습니다. 그냥 참조하십시오. 내가 다시 만들려고했던 코드는 다음과 같습니다 :'Console.WriteLine (AppDomain.CurrentDomain.FriendlyName); ' – KugBuBu
GetMethodSigHelper()를 사용하는 것에 불평하고 있습니다. CallingConvention.Standard는 __stdcall 규칙을 사용하여 관리되지 않는 코드에만 유효합니다. 올바른 풍미가 어떤 모양인지 잘 모르겠다면 DynamicMethod.CreateDelegate()를 먼저 시도해보십시오. –