C#reflection:等待DLL完全加载然后创建对象?

时间:2013-08-06 14:07:40

标签: c# reflection benchmarking

我为经常更改的软件创建了一个插件。我希望我的插件能够与主要软件的每个新版本一起使用。这就是为什么我在通过反射创建插件的主要对象之前加载插件的依赖项(主要软件的可执行文件)。

然而,这并不总是有效:我有时间问题。有时不会(完全)加载DLL,但会执行创建主对象的代码。这会导致缺少依赖项的异常。

如何在创建对象之前等待DLL完全加载?

class PluginStarter
    {
        private MainPluginObject mainPluginObject = null;

        public PluginStarter()
        {
            AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) =>
            {
                var fullAssemblyName = new AssemblyName(eventArgs.Name);              

                if (fullAssemblyName.Name.Equals("MainSoftware"))
                {
                    var found = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, AppDomain.CurrentDomain.FriendlyName));
                    return found;
                }
                else
                {
                    return null;
                }
            };

            Initialize();
        }

        private void Initialize() 
        {
            mainPluginObject = new MainPluginObject();
        }

        public void ShowForm()
        {
            mainPluginObject.ShowForm();
        }

        public void Dispose()
        {
            mainPluginObject.Dispose();
        }
    }

只要我使用Initialize()停用[MethodImpl(MethodImplOptions.NoInlining)]方法的内联,它就能正常工作。 在这里删除正确的解决方案? 如果Assembly中没有事件通知您有关DLL加载状态的信息,我还能做些什么?

1 个答案:

答案 0 :(得分:1)

如果你的方法是内联的,那么将需要dll,因此在调用PluginStarter构造函数之前加载(编译方法时),特别是在AssemblyResolve事件之前已初始化。

因此,您要么确保Initialize不是内联的,要么将AssemblyResolve代码放在静态构造函数中。

使用静态构造函数可能会更干净,因为无论创建多少个PluginStarter对象,它都只会创建一个事件。