首頁 > 後端開發 > C++ > 如何將組件參考遞歸載入到單獨的 AppDomain 中?

如何將組件參考遞歸載入到單獨的 AppDomain 中?

Barbara Streisand
發布: 2025-01-15 11:51:45
原創
823 人瀏覽過

How to Recursively Load Assembly References into a Separate AppDomain?

在獨立 AppDomain 中遞歸載入組件及其參考

將程式集載入到新的 AppDomain 時,請務必遞歸載入其所有引用,以防止出現 FileNotFoundException 錯誤。本文將探討完成此複雜任務的步驟。

首先,建立一個具有自訂 ApplicationBase 的獨立 AppDomain。然後,使用 AssemblyName.GetAssemblyName 載入根組件。但是,僅此一項還不夠;您需要手動載入組件的參考。

為此,使用 ReflectionOnlyLoadFrom 來取得引用的組件列表,而無需實際載入它們。對於每個引用,使用 domain.Load(refAsmName) 將其載入到 AppDomain 中。

但是,這裡有一個需要注意的地方。要在外部應用程式域中執行代理對象,您需要呼叫 CreateInstanceAndUnwrap。此方法可確保物件在目標 AppDomain 中執行。

程式碼範例說明了此過程:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        AppDomainSetup domaininfo = new AppDomainSetup();
        domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
        Evidence adevidence = AppDomain.CurrentDomain.Evidence;
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

        Type type = typeof(Proxy);
        var value = (Proxy)domain.CreateInstanceAndUnwrap(
            type.Assembly.FullName,
            type.FullName);

        var assembly = value.GetAssembly(args[0]);
        // AppDomain.Unload(domain);
    }
}

public class Proxy : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFile(assemblyPath);
        }
        catch (Exception)
        {
            return null;
            // throw new InvalidOperationException(ex);
        }
    }
}</code>
登入後複製

請記住,當使用 LoadFile 而不是 LoadFrom 時,您必須自行載入任何依賴項,以避免 FileNotFound 異常。

以上是如何將組件參考遞歸載入到單獨的 AppDomain 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板