我正在編寫一個.NET庫,將託管的DLL注入到外部進程中。我目前的做法是:AppDomain.CreateInstanceFromAndUnwrap - 無法轉換透明代理
- 使用
CreateRemoteThread
強制目標進程調用LoadLibrary
對非託管引導DLL。從這一點,我們正在執行目標進程中的代碼。 - 然後,我的引導程序DLL創建了一個CLR實例,並在其上調用
ExecuteInDefaultAppDomain
,該實例在受管助手DLL中執行一個方法。 - 此方法創建一個新的AppDomain並調用
AppDomain.CreateInstanceFromAndUnwrap
將執行傳遞到我的負載DLL中,並將結果作爲IInjectionPayload
進行投射。 - 這個想法是,我的有效負載DLL暴露了一個實現了
IInjectionPayload
的類,所以輔助DLL可以簡單地調用payload.Run()
。
我這樣做,以便有效載荷代碼可以通過簡單地呼叫AppDomain.Unload
(在發信號通知清理之後)完全卸載。
這種方法適用 - 在我的有效載荷DLL中的類實例化得到目標進程中,所以代碼可以執行 - 但我不能CreateInstanceFromAndUnwrap
返回的對象強制轉換爲IInjectionPayload
;它會拋出以下異常:
無法轉換透明代理以鍵入'blah.Blah.IInjectionPayload'。
我使用CreateInstanceAndUnwrap
審判,Activator.CreateInstanceFrom
其次Object.Unwrap
,但是這兩種方法也導致拋出相同的異常。
我的有效載荷類的簽名是:
public class Program : MarshalByRefObject, IInjectionPayload
我很爲難,因爲有效載荷DLL肯定是越來越加載和類被實例化,如預期。任何幫助將非常感激。
這只是救了我的屁股。我的問題似乎是從一個目錄中加載一個AppDomain程序集而不是運行可執行文件的目錄。遠程處理對象恢復正常,但是當我解開()它時,它聲稱它不是正確的類型。他的解析器處理器技巧非常有效。 – 2011-11-01 19:30:57