我为经常更改的软件创建了一个插件。我希望我的插件能够与主要软件的每个新版本一起使用。这就是为什么我在通过反射创建插件的主对象之前为我的插件加载依赖项(这是主软件的可执行文件)。
然而,这并不总是有效:我有一个时间问题。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 加载状态的事件,我还能做什么?