> 백엔드 개발 > 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿