วิธีโหลดแอสเซมบลีไปยัง AppDomain พร้อมการอ้างอิงทั้งหมดแบบวนซ้ำ


113

ฉันต้องการโหลดไปยังAppDomainแอสเซมบลีใหม่ซึ่งมีโครงสร้างอ้างอิงที่ซับซ้อน (MyDll.dll -> Microsoft.Office.Interop.Excel.dll -> Microsoft.Vbe.Interop.dll -> Office.dll -> stdole.dll)

เท่าที่ฉันเข้าใจเมื่อกำลังโหลดแอสเซมบลีการAppDomainอ้างอิงจะไม่ถูกโหลดโดยอัตโนมัติและฉันต้องโหลดด้วยตนเอง ดังนั้นเมื่อฉันทำ:

string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory
string path = System.IO.Path.Combine(dir, "MyDll.dll");

AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);

domain.Load(AssemblyName.GetAssemblyName(path));

และได้รับFileNotFoundException:

ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'MyDll, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' หรือการอ้างอิงอย่างใดอย่างหนึ่ง ระบบไม่พบแฟ้มที่ระบุ.

ผมคิดว่าส่วนหนึ่งที่สำคัญคือหนึ่ง dependencies

ตกลงฉันทำอะไรต่อไปก่อน domain.Load(AssemblyName.GetAssemblyName(path));

foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
{
    domain.Load(refAsmName);
}

แต่ได้รับFileNotFoundExceptionอีกครั้งในการชุมนุมอื่น (อ้างอิง)

จะโหลดการอ้างอิงทั้งหมดแบบวนซ้ำได้อย่างไร?

ฉันต้องสร้างแผนผังอ้างอิงก่อนที่จะโหลดแอสเซมบลีรูทหรือไม่ จะรับข้อมูลอ้างอิงของแอสเซมบลีโดยไม่ต้องโหลดได้อย่างไร?


1
ฉันเคยโหลดแอสเซมบลีแบบนี้มาหลายครั้งแล้วฉันไม่เคยโหลดการอ้างอิงทั้งหมดด้วยตนเอง ฉันไม่แน่ใจว่าหลักฐานของคำถามนี้ถูกต้อง
มิก

คำตอบ:


68

คุณต้องเรียกใช้CreateInstanceAndUnwrapก่อนที่วัตถุพร็อกซีของคุณจะดำเนินการในโดเมนแอปพลิเคชันต่างประเทศ

 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);
        }
    }
}

นอกจากนี้โปรดทราบว่าหากคุณใช้LoadFromคุณอาจได้รับFileNotFoundข้อยกเว้นเนื่องจากตัวแก้ไขแอสเซมบลีจะพยายามค้นหาแอสเซมบลีที่คุณกำลังโหลดใน GAC หรือโฟลเดอร์ bin ของแอปพลิเคชันปัจจุบัน ใช้LoadFileเพื่อโหลดไฟล์ประกอบโดยพลการแทน - แต่โปรดทราบว่าหากคุณทำสิ่งนี้คุณจะต้องโหลดการอ้างอิงด้วยตัวเอง


20
ตรวจสอบรหัสที่ผมเขียนในการแก้ปัญหานี้github.com/jduv/AppDomainToolkit โดยเฉพาะให้ดูที่เมธอด LoadAssemblyWithReferences ในคลาสนี้: github.com/jduv/AppDomainToolkit/blob/master/AppDomainToolkit/…
Jduv

3
ฉันพบว่าแม้ว่าจะใช้งานได้เกือบตลอดเวลา แต่ในบางกรณีคุณยังคงต้องแนบตัวจัดการกับAppDomain.CurrentDomain.AssemblyResolveเหตุการณ์ดังที่อธิบายไว้ในคำตอบ MSDNนี้ ในกรณีของฉันฉันพยายามเชื่อมต่อกับการปรับใช้ SpecRun ที่ทำงานภายใต้ MSTest แต่ฉันคิดว่ามันใช้ได้กับหลาย ๆ สถานการณ์ที่โค้ดของคุณอาจไม่ทำงานจากส่วนขยาย "หลัก" AppDomain - VS, MSTest ฯลฯ
Aaronaught

อาน่าสนใจ ฉันจะตรวจสอบสิ่งนั้นและดูว่าฉันสามารถทำให้ใช้งานได้ง่ายขึ้นเล็กน้อยผ่าน ADT หรือไม่ ขออภัยรหัสนั้นตายไประยะหนึ่งแล้วเราทุกคนมีงานทั้งวัน :)
Jduv

@Jduv จะเพิ่มคะแนนความคิดเห็นของคุณประมาณ 100 ครั้งถ้าทำได้ ไลบรารีของคุณช่วยฉันแก้ปัญหาที่ดูเหมือนจะแก้ไม่ได้ที่ฉันพบกับการโหลดแอสเซมบลีแบบไดนามิกภายใต้ MSBuild คุณควรส่งเสริมให้เป็นคำตอบ!
Philip Daniels

2
@Jduv แน่ใจหรือว่าassemblyตัวแปรจะอ้างอิงแอสเซมบลีจาก "MyDomain" ฉันคิดว่าvar assembly = value.GetAssembly(args[0]);คุณจะโหลดargs[0]ทั้งสองโดเมนและ assemblyตัวแปรจะอ้างอิงสำเนาจากโดเมนแอปพลิเคชันหลัก
Igor Bendrup

14

http://support.microsoft.com/kb/837908/en-us

รุ่น C #:

สร้างคลาสโมเดอเรเตอร์และสืบทอดจากMarshalByRefObject:

class ProxyDomain : MarshalByRefObject
{
    public Assembly GetAssembly(string assemblyPath)
    {
        try
        {
            return Assembly.LoadFrom(assemblyPath);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(ex.Message);
        }
    }
}

โทรจากไซต์ลูกค้า

ProxyDomain pd = new ProxyDomain();
Assembly assembly = pd.GetAssembly(assemblyFilePath);

6
วิธีการแก้ปัญหานี้นำไปสู่บริบทของการสร้าง AppDomain ใหม่มีคนอธิบายได้อย่างไร
Tri Q Tran

2
A MarshalByRefObjectสามารถส่งไปรอบ ๆ appdomains ดังนั้นฉันจะเดาว่าAssembly.LoadFromพยายามโหลดแอสเซมบลีใน appdomain ใหม่สิ่งที่เป็นไปได้ก็ต่อเมื่อสามารถส่งผ่านวัตถุการเรียกระหว่างแอปโดเมนเหล่านั้นได้ เรียกอีกอย่างว่าระยะไกลตามที่อธิบายไว้ที่นี่: msdn.microsoft.com/en-us/library/…
Christoph Meißner

32
วิธีนี้ใช้ไม่ได้ หากคุณรันโค้ดและตรวจสอบ AppDomain.CurrentDomain.GetAssemblies () คุณจะเห็นว่าแอสเซมบลีเป้าหมายที่คุณพยายามโหลดนั้นโหลดลงในโดเมนแอปพลิเคชันปัจจุบันไม่ใช่พร็อกซี
Jduv

41
นี่เป็นเรื่องไร้สาระโดยสิ้นเชิง การสืบทอดจากMarshalByRefObjectไม่ได้ทำให้โหลดในทุก ๆ อย่างน่าอัศจรรย์AppDomainเพียงแค่บอกให้. NET framework สร้างพร็อกซีระยะไกลแบบโปร่งใสแทนที่จะใช้การทำให้เป็นอนุกรมเมื่อคุณแกะการอ้างอิงจากที่AppDomainอื่นAppDomain(วิธีการทั่วไปคือCreateInstanceAndUnwrapวิธีการ) ไม่อยากจะเชื่อเลยว่าคำตอบนี้มีผู้โหวตมากกว่า 30 คน รหัสที่นี่เป็นเพียงวิธีการโทรแบบAssembly.LoadFromอ้อม
Aaronaught

1
ใช่ดูเหมือนเป็นเรื่องไร้สาระ แต่มี 28 โหวตและถูกทำเครื่องหมายว่าเป็นคำตอบ ลิงค์ที่ให้มาไม่ได้พูดถึง MarshalByRefObject ค่อนข้างแปลกประหลาด ถ้าสิ่งนี้ทำอะไรได้จริงฉันจะรักใครให้อธิบาย
มิก

12

เมื่อคุณส่งอินสแตนซ์แอสเซมบลีกลับไปยังโดเมนผู้โทรโดเมนผู้โทรจะพยายามโหลด! นี่คือเหตุผลที่คุณได้รับข้อยกเว้น สิ่งนี้เกิดขึ้นในบรรทัดสุดท้ายของโค้ดของคุณ:

domain.Load(AssemblyName.GetAssemblyName(path));

ดังนั้นสิ่งที่คุณต้องการจะทำอย่างไรกับการชุมนุมที่ควรจะทำในระดับพร็อกซี - คลาสที่สืบทอดMarshalByRefObject

ให้นับว่าโดเมนผู้เรียกและโดเมนที่สร้างขึ้นใหม่ทั้งสองควรมีสิทธิ์เข้าถึงแอสเซมบลีคลาสพร็อกซี หากปัญหาของคุณไม่ซับซ้อนเกินไปให้ลองปล่อยโฟลเดอร์ ApplicationBase ไว้โดยไม่มีการเปลี่ยนแปลงดังนั้นมันจะเหมือนกับโฟลเดอร์โดเมนผู้โทร (โดเมนใหม่จะโหลดเฉพาะแอสเซมบลีที่ต้องการเท่านั้น)

ในรหัสง่ายๆ:

public void DoStuffInOtherDomain()
{
    const string assemblyPath = @"[AsmPath]";
    var newDomain = AppDomain.CreateDomain("newDomain");
    var asmLoaderProxy = (ProxyDomain)newDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(ProxyDomain).FullName);

    asmLoaderProxy.GetAssembly(assemblyPath);
}

class ProxyDomain : MarshalByRefObject
{
    public void GetAssembly(string AssemblyPath)
    {
        try
        {
            Assembly.LoadFrom(AssemblyPath);
            //If you want to do anything further to that assembly, you need to do it here.
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(ex.Message, ex);
        }
    }
}

หากคุณไม่จำเป็นต้องโหลดแอสเซมบลีจากโฟลเดอร์ที่แตกต่างจากโฟลเดอร์โดเมนแอพปัจจุบันของคุณให้สร้างโดเมนแอพใหม่โดยใช้โฟลเดอร์เส้นทางการค้นหา dlls เฉพาะ

ตัวอย่างเช่นบรรทัดการสร้างโดเมนแอปจากโค้ดด้านบนควรแทนที่ด้วย:

var dllsSearchPath = @"[dlls search path for new app domain]";
AppDomain newDomain = AppDomain.CreateDomain("newDomain", new Evidence(), dllsSearchPath, "", true);

ด้วยวิธีนี้ dlls ทั้งหมดจะได้รับการแก้ไขโดยอัตโนมัติจาก dllsSearchPath


เหตุใดฉันจึงต้องโหลดแอสเซมบลีโดยใช้คลาสพร็อกซี อะไรคือความแตกต่างเมื่อเทียบกับการโหลดโดยใช้ Assembly.LoadFrom (string) ฉันสนใจรายละเอียดทางเทคนิคจากมุมมองของ CLR ฉันจะขอบคุณมากหากคุณสามารถให้คำตอบได้
Dennis Kassel

คุณใช้คลาสพร็อกซีเพื่อหลีกเลี่ยงไม่ให้แอสเซมบลีใหม่ถูกโหลดในโดเมนผู้โทรของคุณ หากคุณใช้ Assembly.LoadFrom (สตริง) โดเมนผู้โทรจะพยายามโหลดการอ้างอิงแอสเซมบลีใหม่และไม่พบเนื่องจากไม่ได้ค้นหาแอสเซมบลีใน "[AsmPath]" ( msdn.microsoft.com/en-us/library/yx7xezcf%28v=vs.110%29.aspx )
Nir

11

ใน AppDomain ใหม่ของคุณให้ลองตั้งค่าตัวจัดการเหตุการณ์AssemblyResolve เหตุการณ์นั้นจะถูกเรียกเมื่อการอ้างอิงขาดหายไป


มันไม่ อันที่จริงคุณจะได้รับข้อยกเว้นในบรรทัดที่คุณกำลังลงทะเบียนเหตุการณ์นี้ใน AppDomain ใหม่ คุณต้องลงทะเบียนเหตุการณ์นี้ใน AppDomain ปัจจุบัน
user1004959

ถ้าคลาสนั้นสืบทอดมาจาก MarshalByRefObject ไม่ได้หากคลาสถูกทำเครื่องหมายด้วยแอตทริบิวต์ [Serializable] เท่านั้น
user2126375

5

คุณต้องจัดการเหตุการณ์ AppDomain.AssemblyResolve หรือ AppDomain.ReflectionOnlyAssemblyResolve (ขึ้นอยู่กับโหลดที่คุณทำ) ในกรณีที่แอสเซมบลีที่อ้างอิงไม่ได้อยู่ใน GAC หรือบนเส้นทางการตรวจสอบของ CLR

AppDomain.AssemblyResolve

AppDomain.ReflectionOnlyAssemblyResolve


ดังนั้นฉันต้องระบุแอสเซมบลีที่ร้องขอด้วยตนเอง? แม้ว่ามันจะอยู่ใน AppBase ใหม่ของ AppDomain? มีวิธีที่จะไม่ทำเช่นนั้นหรือไม่?
abatishchev

5

ฉันใช้เวลาสักพักกว่าจะเข้าใจคำตอบของ @ user1996230 ดังนั้นฉันจึงตัดสินใจที่จะให้ตัวอย่างที่ชัดเจนยิ่งขึ้น ในตัวอย่างด้านล่างฉันสร้างพร็อกซีสำหรับวัตถุที่โหลดใน AppDomain อื่นและเรียกใช้เมธอดบนวัตถุนั้นจากโดเมนอื่น

class ProxyObject : MarshalByRefObject
{
    private Type _type;
    private Object _object;

    public void InstantiateObject(string AssemblyPath, string typeName, object[] args)
    {
        assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + AssemblyPath); //LoadFrom loads dependent DLLs (assuming they are in the app domain's base directory
        _type = assembly.GetType(typeName);
        _object = Activator.CreateInstance(_type, args); ;
    }

    public void InvokeMethod(string methodName, object[] args)
    {
        var methodinfo = _type.GetMethod(methodName);
        methodinfo.Invoke(_object, args);
    }
}

static void Main(string[] args)
{
    AppDomainSetup setup = new AppDomainSetup();
    setup.ApplicationBase = @"SomePathWithDLLs";
    AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup);
    ProxyObject proxyObject = (ProxyObject)domain.CreateInstanceFromAndUnwrap(typeof(ProxyObject).Assembly.Location,"ProxyObject");
    proxyObject.InstantiateObject("SomeDLL","SomeType", new object[] { "someArgs});
    proxyObject.InvokeMethod("foo",new object[] { "bar"});
}

รหัสพิมพ์ผิดเล็ก ๆ น้อย ๆ และฉันต้องยอมรับว่าฉันไม่เชื่อว่ามันจะได้ผล แต่นี่เป็นการช่วยชีวิตฉัน ขอบคุณมาก
Owen Ivory

4

คีย์คือเหตุการณ์ AssemblyResolve ที่ได้รับการยกขึ้นโดย AppDomain

[STAThread]
static void Main(string[] args)
{
    fileDialog.ShowDialog();
    string fileName = fileDialog.FileName;
    if (string.IsNullOrEmpty(fileName) == false)
    {
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        if (Directory.Exists(@"c:\Provisioning\") == false)
            Directory.CreateDirectory(@"c:\Provisioning\");

        assemblyDirectory = Path.GetDirectoryName(fileName);
        Assembly loadedAssembly = Assembly.LoadFile(fileName);

        List<Type> assemblyTypes = loadedAssembly.GetTypes().ToList<Type>();

        foreach (var type in assemblyTypes)
        {
            if (type.IsInterface == false)
            {
                StreamWriter jsonFile = File.CreateText(string.Format(@"c:\Provisioning\{0}.json", type.Name));
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                jsonFile.WriteLine(serializer.Serialize(Activator.CreateInstance(type)));
                jsonFile.Close();
            }
        }
    }
}

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string[] tokens = args.Name.Split(",".ToCharArray());
    System.Diagnostics.Debug.WriteLine("Resolving : " + args.Name);
    return Assembly.LoadFile(Path.Combine(new string[]{assemblyDirectory,tokens[0]+ ".dll"}));
}

0

ฉันต้องทำหลายครั้งและค้นคว้าวิธีแก้ปัญหาต่างๆมากมาย

วิธีแก้ปัญหาที่ฉันพบในความหรูหราและง่ายที่สุดสามารถนำไปใช้ได้เช่นนี้

1. สร้างโปรเจ็กต์ที่คุณสามารถสร้างอินเทอร์เฟซง่ายๆ

อินเทอร์เฟซจะมีลายเซ็นของสมาชิกที่คุณต้องการโทรหา

public interface IExampleProxy
{
    string HelloWorld( string name );
}

สิ่งสำคัญคือต้องทำให้โครงการนี้สะอาดและเป็นประโยชน์ เป็นโครงการที่ทั้งสองAppDomainสามารถอ้างอิงได้และจะช่วยให้เราไม่สามารถอ้างอิงถึงสิ่งที่Assemblyเราต้องการโหลดในโดเมนแยกจากแอสเซมบลีไคลเอ็นต์ของเรา

2. AppDomainตอนนี้สร้างโครงการที่มีรหัสที่คุณต้องการที่จะโหลดในแยก

โปรเจ็กต์นี้เช่นเดียวกับไคลเอนต์พร็อกจะอ้างอิงพร็อกซีพร็อกและคุณจะใช้อินเทอร์เฟซ

public interface Example : MarshalByRefObject, IExampleProxy
{
    public string HelloWorld( string name )
    {
        return $"Hello '{ name }'";
    }
}

3. ถัดไปในโปรเจ็กต์ไคลเอนต์โหลดโค้ดในอีกAppDomainอัน

ตอนนี้เราสร้างไฟล์AppDomain. สามารถระบุตำแหน่งฐานสำหรับการอ้างอิงการประกอบ การตรวจสอบจะตรวจสอบแอสเซมบลีที่ขึ้นต่อกันใน GAC และในไดเร็กทอรีปัจจุบันและAppDomainฐานข้อมูล

// set up domain and create
AppDomainSetup domaininfo = new AppDomainSetup
{
    ApplicationBase = System.Environment.CurrentDirectory
};

Evidence adevidence = AppDomain.CurrentDomain.Evidence;

AppDomain exampleDomain = AppDomain.CreateDomain("Example", adevidence, domaininfo);

// assembly ant data names
var assemblyName = "<AssemblyName>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null|<keyIfSigned>";
var exampleTypeName = "Example";

// Optional - get a reflection only assembly type reference
var @type = Assembly.ReflectionOnlyLoad( assemblyName ).GetType( exampleTypeName ); 

// create a instance of the `Example` and assign to proxy type variable
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( assemblyName, exampleTypeName );

// Optional - if you got a type ref
IExampleProxy proxy= ( IExampleProxy )exampleDomain.CreateInstanceAndUnwrap( @type.Assembly.Name, @type.Name );    

// call any members you wish
var stringFromOtherAd = proxy.HelloWorld( "Tommy" );

// unload the `AppDomain`
AppDomain.Unload( exampleDomain );

หากคุณต้องการมีหลายวิธีในการโหลดชุดประกอบ คุณสามารถใช้วิธีอื่นกับโซลูชันนี้ หากคุณมีชื่อแอสเซมบลีที่มีคุณสมบัติเหมาะสมฉันต้องการใช้CreateInstanceAndUnwrapเนื่องจากมันโหลดไบต์แอสเซมบลีจากนั้นสร้างอินสแตนซ์ประเภทของคุณให้คุณและส่งคืนค่าobjectที่คุณสามารถส่งไปยังประเภทพร็อกซีของคุณอย่างง่ายหรือหากคุณไม่ได้พิมพ์เป็นรหัสที่พิมพ์มากคุณสามารถทำได้ ใช้รันไทม์ภาษาแบบไดนามิกและกำหนดอ็อบเจ็กต์ที่ส่งคืนให้กับdynamicตัวแปรที่พิมพ์แล้วเพียงแค่เรียกสมาชิกจากนั้นโดยตรง

ที่นั่นคุณมี

สิ่งนี้ช่วยให้สามารถโหลดแอสเซมบลีที่ proj ไคลเอนต์ของคุณไม่มีการอ้างอิงในการแยกAppDomainและเรียกสมาชิกจากไคลเอนต์

ในการทดสอบฉันต้องการใช้หน้าต่าง Modules ใน Visual Studio จะแสดงโดเมนแอสเซมบลีไคลเอ็นต์ของคุณและโมดูลทั้งหมดที่โหลดในโดเมนนั้นรวมถึงโดเมนแอพใหม่ของคุณและแอสเซมบลีหรือโมดูลใดบ้างที่โหลดในโดเมนนั้น

กุญแจสำคัญคือการตรวจสอบให้แน่ใจว่ารหัสของคุณได้มาMarshalByRefObjectหรือสามารถต่ออนุกรมกันได้

`MarshalByRefObject จะอนุญาตให้คุณกำหนดค่าอายุการใช้งานของโดเมนในตัวอย่างเช่นคุณต้องการให้โดเมนทำลายหากไม่มีการเรียกใช้พร็อกซีใน 20 นาที

ฉันหวังว่านี่จะช่วยได้.


สวัสดีถ้าฉันจำไม่ผิดปัญหาหลักคือวิธีการโหลดการอ้างอิงทั้งหมดแบบวนซ้ำดังนั้นคำถาม โปรดทดสอบโค้ดของคุณโดยการเปลี่ยน HelloWorld เพื่อส่งคืนคลาสประเภทFoo, FooAssemblyที่มีคุณสมบัติเป็นประเภทBar, BarAssemblyได้แก่ 3 แอสเซมบลีทั้งหมด มันจะทำงานต่อไปหรือไม่?
abatishchev

ใช่ต้องมีการระบุไดเร็กทอรีที่เหมาะสมในขั้นตอนการตรวจสอบการประกอบ AppDomain มี ApplicationBase อย่างไรก็ตามฉันไม่ได้ทดสอบ ไฟล์กำหนดค่าคุณสามารถระบุไดเร็กทอรีการตรวจสอบแอสเซมบลีเช่น app.config ซึ่ง dll สามารถใช้ได้เช่นกันเพียงแค่ตั้งค่าให้คัดลอกในคุณสมบัติ นอกจากนี้หากคุณมีอำนาจควบคุมการสร้างแอสเซมบลีที่ต้องการโหลดในโดเมนแอพแยกต่างหากการอ้างอิงสามารถรับ HintPath ที่ระบุว่าต้องค้นหา หากทุกอย่างล้มเหลวฉันจะส่งผลให้สมัครสมาชิกเหตุการณ์ AppDomains AssemblyResolve ใหม่และโหลดแอสเซมบลีด้วยตนเองตัวอย่างเช่นสำหรับสิ่งนั้น
SimperT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.