2012-09-07 20 views
8

実行時にアセンブリをロードしようとしていますが、スタティックを使用してアセンブリ内にタイプのインスタンスを作成できない理由がわかりませんActivator.CreateInstance()。それはAssembly.CreateInstance()で動作します。実行時にアセンブリをロードし、Activator.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をその のdependenc ies。システムは、指定されたファイルを見つけることができません。

EDIT:どちらの場合も

私はAppDomain.CurrentDomain.GetAssemblies()で見たとき、Assembly.LoadFrom()コールの後、私は私のアセンブリがロードされていることがわかります。

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

EDIT:

+1

2番目のバージョンでは、表示名だけでなく、完全なアセンブリ名を指定し、フードの下にAssembly.Load()を使用する必要があります。 LoadFrom()と同じではありません。 fuslogvw.exeのトラブルシューティング –

+0

「MyAssembly、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 5dc3e20777fed081」のように? – davenewza

+0

私はGetAssemblies()の "MyAssembly"からFullNameをまっすぐコピーしたし、まだ動作しません。混乱している! – davenewza

答えて

2

を使用してファイルを調整することができ、この仕事をしていますか?

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

同じ問題が発生します。 Assembly.LoadFrom()の後に 'AppDomain.CurrentDomain.GetAssemblies()'を見ると、どちらの場合でもアセンブリがロードされているのがわかります。 – davenewza

+1

@davenewza私の編集をチェックして、それが動作するかどうか確認してください。 –

+0

それはありません。私はType.GetType()で "Valueはnullにはなれません"を得る。 – davenewza

3

あなたは彼のパスあなたが最初にあなたの現在のAppDomainにアセンブリをロードする必要が

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

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

Activator.CreateInstance()を使用する必要があります。なぜなら、常にアセンブリのインスタンスを利用できるわけではないからです。 – davenewza

+1

@davenewza投稿するコードを追加しました –

1

元の回答を編集しようとしましたが、投稿者から回答がありませんでした。だから場合にはいくつかのいずれかがこれを必要とする、ここでは特定のコンストラクタにアクセスするための入力パラメータを渡し、プラス彼の答えのこの変化は解決できるように、私のために働いたコード

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

ここで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); 

...後でそれ自身のフォーム/ウィンドウでそれを起動するために(私の基本クラスに)必要に応じて私は、後にオブジェクトをキャストすることができたから。

関連する問題