2012-05-28 11 views
9

暗号化アセンブリを動的にロードしようとしていますが、正しいクラス名を使用していてもGetTypeがnullを返しています。コードは次のとおりです。Assembly.GetTypeがnullを返しています

//Load encryption assembly. 
Assembly encryptionAssembly = Assembly.LoadFrom("Encryption.dll"); 
foreach(Type t in encryptionAssembly.GetTypes()) 
    { 
     MessageBox.Show(t.Name.ToString()); 
     // This shows "Encryption" 
    } 
Type encryptionClass = encryptionAssembly.GetType("Encryption"); 
// But this returns null 

私はこれで少し頭痛があります。クラスは公開されており、間違いなく正しく綴っています。

ありがとうございます。あなたは、たとえば、タイプの完全な名前空間を指定する必要があり

+0

どのようにそのクラスが宣言されていますか? – Tigran

+0

VS内のオブジェクトブラウザを使用していません。 –

+0

@HansPassant - うん、私は絶対にやった。今夜私のための拘禁。 – Ste

答えて

12

ここ

MessageBox.Show(t.FullName.ToString()); //FULLNAME 

プリントアウトタイプのと使用後のそのFullNameアセンブリから型を取得する。

+0

ありがとうございます。これは私のためにやった。 'FullName'はそれが" MyCompany.Library.Encryption "であることを知らせます。誰かがあなたにdllを電子メールで送り、「ここに使用する暗号化アセンブリがあります」と言われたらどうなるのでしょうか!恥私はすべての回答を受け入れることができません、他の人はまた、私は名前空間が必要だと指摘した。私はあまりにもそれらをupvoteよ。 – Ste

+0

また、クラスにconstructor()があることを確認してください。 – timothy

4

試し(namespace.classname):

encryptionAssembly.GetType("My.Namespace.Encryption") 

は、あなたが使用してそれを知ることができますt.FullName

+0

あなたがそれを知りたくなければ、反射器でそれを探してみてください – eyossi

+0

ありがとうございます。 +1。私はTigranの答えを受け入れる必要がありました。なぜなら、彼は私に「FullName」を決定する最も速い方法を提供したからです。 – Ste

7

暗号化のタイプの完全な名前を指定する

+1

+1。ありがとう。私は将来、再び便利になる気がする。 – Ste

0

実行時にアセンブリの完全修飾名がわかりませんでしたが、アセンブリのExportedTypesからクラス名のみを使用して型を取得できました。例えば、「クラス名」のエクスポートタイプを取得しますが、これは最初のものだけになるだろう「クラス名」の同じ名前を持つ複数の種類があったが、これは、DLLの安全なソリューションである場合

var assembly = Assembly.LoadFile(dllPath); 
var types = assembly.ExportedTypes; 
if(types != null) 
{ 
    var type = types.Where(x => x.Name == "ClassName").FirstOrDefault(); 
} 

私はロードしています。

0

私の場合、プロジェクトのファイル/ .csファイルが見つかりませんでした。私は欠けているcsファイルを追加し、それは魅力のように働いた。 ProjectAというCSプロジェクトがあります。そのコードでは、フルクラス名のProjectA.ClassAを探しています。このエラーが発生したとき、私はProjectAに行き、ClassA.csがマージ問題のために見つからなかったことを確認しました。 ProjectAにClassA.csを追加/追加しても問題ありません。

関連する問題