我爲經常變化的軟件創建了一個插件。我希望我的插件能夠與主軟件的每個新版本一起工作。這就是爲什麼我在通過反射創建插件的主對象之前,短時間加載插件的依賴關係(這是主軟件的可執行文件)。C#反射:等待DLL完全加載,然後創建對象?
但是,這並不總是奏效:我有時間問題。 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加載狀態,還能做些什麼?
您是否驗證過要返回null的程序集? –
@ LasseV.Karlsen:我想把'null'換成其他的東西。 –
嘗試'Assembly.LoadFrom'而不是'Assembly.LoadFile',看看它是否有任何區別。更多關於[this](http://stackoverflow.com/questions/1477843/difference-between-loadfile-and-loadfrom-with-net-assemblies)。 – Noseratio