14

実行時にアセンブリを読み込もうとしていますが、 static を使用してアセンブリに型のインスタンスを作成できない理由がわかりません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' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

編集:

どちらの場合も、Assembly.LoadFrom()呼び出しの後、 を調べると、アセンブリが読み込まれていることがわかりますAppDomain.CurrentDomain.GetAssemblies()

4

4 に答える 4

5

彼のパスでファイルを調整できます

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

var TypeName = "";
Type type = thisAssembly.GetType(TypeName);
object instance = Activator.CreateInstance(type);
于 2012-09-07T11:55:48.137 に答える
4

最初にアセンブリを現在の AppDomain に読み込む必要があります。

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

編集:これは機能しますか?

Form form = (Form)Activator.CreateInstance(Type.GetType(typeName))
于 2012-09-07T11:56:06.230 に答える
2

元の回答を編集しようとしましたが、著者からの回答がありませんでした。したがって、誰かがこれを必要とする場合に備えて、これが私のために働いたコードです

System.Reflection.Assembly assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes("DLL_PATH"));  
Form form = (Form)assembly.CreateInstance("FullNameSpace.ClassName");
于 2014-11-16T10:29:16.883 に答える
0

ここでの A Khudairy の回答のバリエーションで、入力パラメーターを渡して特定のコンストラクターにアクセスできるようになりました。さらに、彼の回答のこのバリエーションは、私が抱えていた問題を解決し、解決しようとして数週間文字通りオンとオフを繰り返してきました (多くの称賛答えを共有してくれた彼に)。

私の問題は、.NET 3.5 dll を .NET 4.6 である新しいアプリケーションにロードしたかったのですが、これらの古い dll は、CAS ポリシーを使用するように見えるサードパーティ コントロールを使用していました。サードパーティのコントロールから、app.config を有効にする必要があるというエラーが表示されます。そうすれば、ファイルがローカル コンピューター上にある場合は問題なく読み込んで実行できますが、私が行う必要があるネットワークドライブ、そして FileIOPermission エラーが発生しました。

NetFx40_LegacySecurityPolicy と loadFromRemoteSources および useLegacyV2RuntimeActivationPolicy の組み合わせを実行しようとし、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);

...そこから、必要に応じてオブジェクトを(基本クラスに)キャストして、後で独自のフォーム/ウィンドウで起動できます。

于 2018-03-06T23:37:46.110 に答える