簡體   English   中英

在運行時加載程序集並使用Activator.CreateInstance()創建實例

[英]Loading assemblies at runtime and creating instances using Activator.CreateInstance()

我試圖在運行時加載程序集,我不確定為什么我不能使用靜態Activator.CreateInstance()在程序集中創建一個類型的實例。 它適用於Assembly.CreateInstance()

string assemblyFilename = "MyAssembly.dll";
string assemblyName = "MyAssembly";
string typeName = "MyAssembly.MyType";

FileInfo fileInfo = new FileInfo(assemblyFilename);

這有效:

var assembly = Assembly.LoadFrom(assemblyFilename);
Form form = (Form)assembly.CreateInstance(typeName);

但這不起作用:

Assembly.LoadFrom(assemblyFilename);
Form form = (Form)Activator.CreateInstance(assemblyName, typeName).Unwrap();

拋出FileNotFoundException:

無法加載文件或程序集“MyAssembly”或其依賴項之一。 該系統找不到指定的文件。

編輯:

在這兩種情況下,在Assembly.LoadFrom()調用之后,當我查看AppDomain.CurrentDomain.GetAssemblies()時,我可以看到我的程序集已被加載。

您可以使用其路徑調整文件

var path = Assembly.GetAssembly(MyType.GetType()).Location;
var thisAssembly= Assembly.LoadFrom(path);

var TypeName = "";
Type type = thisAssembly.GetType(TypeName);
object instance = Activator.CreateInstance(type);

您必須先將程序集加載到當前的AppDomain中:

AppDomain.CurrentDomain.Load(File.ReadAllBytes(assemblyFileName));

編輯:這有用嗎?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName))

試圖編輯原始答案,但我沒有得到作者的回應。 所以,如果有人需要這個,這里的代碼對我有用

System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH"));  
Form form = (Form)assembly.CreateInstance("FullNameSpace.ClassName");

這是A Khudairy答案的一個變體,允許傳入輸入參數來訪問特定的構造函數,加上他的答案的這種變化解決了我已經擁有的問題,並且幾個星期以來一直試圖解決這個問題現在試圖解決(許多榮譽)給他分享答案)。

我的問題是我想將.NET 3.5 dll加載到.NET 4.6的新應用程序中,但那些舊的dll使用了第三方控件,這些控件看起來使用了CAS策略。 我從第三方控件中得到一個錯誤,說我需要轉入app.config,如果我這樣做,我可以加載並運行文件就好了,如果它們在我的本地計算機上,但如果我試圖加載它們一個網絡驅動器,我需要做,然后我得到一個FileIOPermission錯誤。

嘗試使用loadFromRemoteSources和useLegacyV2RuntimeActivationPolicy運行NetFx40_LegacySecurityPolicy的組合,並嘗試了幾種不同的方法,例如Activator.CreateInstance(),它通常適用於我,嘗試創建一個沙箱(雖然我不知道我是否正確使用),但沒有任何方法可行,除了下面。 請注意,我的用戶控件也基於基類。 我在授予訪問網絡驅動器權限之前運行了一些CAS命令提示符命令,我的應用程序應該完全信任。 無論如何,它看起來不像我試過的任何方法,除了這個方法迄今為止對我有用。

代碼修復:

object dllUserControl = null;
System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH"));  
dllUserControl = assembly.CreateInstance("FullNameSpace.ClassName",true,BindingFlags.Default,null,constructorParams[],null,null);

...我可以根據需要將對象(我的基類)轉換為以后在其自己的窗體/窗口中啟動它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM