2009-09-17 65 views
19

我正在編寫一個.NET庫,將託管的DLL注入到外部進程中。我目前的做法是:AppDomain.CreateInstanceFromAndUnwrap - 無法轉換透明代理

  1. 使用CreateRemoteThread強制目標進程調用LoadLibrary對非託管引導DLL。從這一點,我們正在執行目標進程中的代碼。
  2. 然後,我的引導程序DLL創建了一個CLR實例,並在其上調用ExecuteInDefaultAppDomain,該實例在受管助手DLL中執行一個方法。
  3. 此方法創建一個新的AppDomain並調用AppDomain.CreateInstanceFromAndUnwrap將執行傳遞到我的負載DLL中,並將結果作爲IInjectionPayload進行投射。
  4. 這個想法是,我的有效負載DLL暴露了一個實現了IInjectionPayload的類,所以輔助DLL可以簡單地調用payload.Run()

我這樣做,以便有效載荷代碼可以通過簡單地呼叫AppDomain.Unload(在發信號通知清理之後)完全卸載。

這種方法適用 - 在我的有效載荷DLL中的類實例化得到目標進程中,所以代碼可以執行 - 但我不能CreateInstanceFromAndUnwrap返回的對象強制轉換爲IInjectionPayload;它會拋出以下異常:

無法轉換透明代理以鍵入'blah.Blah.IInjectionPayload'。

我使用CreateInstanceAndUnwrap審判,Activator.CreateInstanceFrom其次Object.Unwrap,但是這兩種方法也導致拋出相同的異常。

我的有效載荷類的簽名是:

public class Program : MarshalByRefObject, IInjectionPayload

我很爲難,因爲有效載荷DLL肯定是越來越加載和類被實例化,如預期。任何幫助將非常感激。

回答

23

發現這個問題這裏的修復:http://www.west-wind.com/WebLog/posts/601200.aspx

它看起來像在.NET框架的錯誤。解決方案是添加一個處理程序到AppDomain.CurrentDomain.AssemblyResolve手動加載&返回程序集在args.Name。然後,您可以撥打CreateInstanceFromAndUnwrap而不引發異常。

+1

這只是救了我的屁股。我的問題似乎是從一個目錄中加載一個AppDomain程序集而不是運行可執行文件的目錄。遠程處理對象恢復正常,但是當我解開()它時,它聲稱它不是正確的類型。他的解析器處理器技巧非常有效。 – 2011-11-01 19:30:57