3

C#の親アセンブリで参照のリストを取得するにはどうすればよいですか。別のプログラムにロードされるDLLについて考えています。ドライバーは、リフレクションとシリアル化で親アセンブリ参照の一部を使用する必要があります。どこから始めればいいのかわからないので、今のところ何も試していません。

4

1 に答える 1

4

アセンブリをロードする必要があり、アセンブリに参照が含まれている場合、これはかなり古典的なリフレクションの問題です。これらの参照は、呼び出し元のアセンブリを参照していません。

基本的に、アセンブリを別のアプリケーションドメイン内にロードする必要があります。

たとえば、クラスProxyTypeを持つプロジェクトProxyDomainがあります。

public class ProxyType : MarshalByRefObject
{
    public void DoSomeStuff(string assemblyPath)
    {
        var someStuffAssembly = Assembly.LoadFrom(assemblyPath);

        //Do whatever you need with the loaded assembly, e.g.:
        var someStuffType = assembly.GetExportedTypes()
            .First(t => t.Name == "SomeStuffType");
        var someStuffObject = Activator.CreateInstance(someStuffType);

        someStuffType.GetMethod("SomeStuffMethod").Invoke(someStuffObject, null);
    }
}

また、ProxyDomainへの参照を含む呼び出し元のプロジェクトでは、アセンブリをロードし、DoSomeStuffを実行して、アセンブリリソースをアンロードする必要があります。

public class SomeStuffCaller
{
    public void CallDoSomeStuff(string assemblyPath)
    {
        AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
        //Path to the directory, containing the assembly
        setup.ApplicationBase = "...";
        //List of directories where your private references are located
        setup.PrivateBinPath = "...";
        setup.ShadowCopyFiles = "true";

        var reflectionDomain = AppDomain.CreateDomain("ProxyDomain", null, setup);

        //You should specify the ProxyDomain assembly full name
        //You can also utilize CreateInstanceFromAndUnwrap here:
        var proxyType = (ProxyType)reflectionDomain.CreateInstanceAndUnwrap(
            "ProxyDomain", 
            "ProxyType");

        proxyType.DoSomeStuff(assemblyPath);

        AppDomain.Unload(reflectionDomain);
    }
}
于 2013-03-02T15:00:25.577 に答える