如何在Assembly.LoadFile()之前从DLL中读取属性

6
我的程序有一个插件管理器模块,它可以加载DLL文件并运行其中的方法,但我需要在“Assembly.LoadFile()”之前读取DLL属性。我该怎么办?
我已经阅读了关于Assembly文档的内容,他们是在“Assembly.LoadFile()”之后读取属性的,你知道Assembly没有“UnLoad()”方法,所以我必须在LoadFile()之前读取属性。 enter image description here
    private void ImprotZip(string path)
    {
        /*
        1、create tempDir, uppackage to tempDir
        2、Load Plugin DLL, Load plugin dependent lib DLL
        */
        string tempDirectory = CreateRuntimeDirectory(path);
        string[] dllFiles = Directory.GetFiles(tempDirectory);
        ///Load DlL
        foreach(string dll in dllFiles)
        {
            ImprotDll(dll, false);
        }
        string libPath = string.Format("{0}\\lib\\", tempDirectory);
        if (!Directory.Exists(libPath))
            return;
        string[] dlls = Directory.GetFiles(libPath);
        ///Load plugin dependent lib DLL
        foreach(string dll in dlls)
        {
            try
            {
                //filtering same DLL 
                //if(Dll.properties.AssemblyProduct != "something")
                //continue;
                Assembly.LoadFile(dll);
            }
            catch(Exception e)
            {
                e.Log();
            }
        }
    }

是否有可能强制要求可查询的元数据与目标dll文件分开放置在单独的文件中? - James
你的意思是我可以为插件 DLL 文件创建一个 XML 文档吗? - Zigit Ho
你应该发布更多的代码,这可能是实现你想要的更好的整体方式,听起来这似乎可以从一些设计调整中受益。或者在StackExchange - CodeReview上发布。 - Ryan Mann
我想要一个可过滤的相同DLL,如果我加载相同的DLL,程序将会崩溃。 - Zigit Ho
3个回答

4
你可以使用 Assembly.ReflectionOnlyLoad 将程序集加载到反射上下文中。
我建议你为反射上下文创建一个应用程序域,这样在完成后可以卸载该域。你可以使用 AppDomain.CreateDomain 方法来创建应用程序域。无论如何,你应该为插件创建应用程序域,这样在完成后可以卸载它们。

如果我加载相同的DLL,我担心程序会崩溃。 - Zigit Ho

1

0

尝试使用此代码

AppDomain.CurrentDomain.AssemblyResolve += (sender, bargs) => {

                String dllName = new AssemblyName(bargs.Name).Name + ".dll";
                var assem = Assembly.GetExecutingAssembly();
                String resourceName = assem.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
                if (resourceName == null) return null; // For null assembly
                using (var stream = assem.GetManifestResourceStream(resourceName))
                {
                    Byte[] assemblyData = new Byte[stream.Length];
                    stream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData);
                }
            };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接