1

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

然而,这并不总是有效:我有一个时间问题。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 加载状态的事件,我还能做什么?

4

1 回答 1

1

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

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

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

于 2013-08-06T18:10:24.610 回答