3

「任意の CPU」としてコンパイルされた .Net アプリがあります。x64 OSで実行しているため、64ビットとして実行されています。アプリケーションは、ユーザーが提供する他のアセンブリを読み込みます。もちろん、リフレクションを使用して、ユーザーが提供したアセンブリから型を読み取ります。ユーザー アセンブリが「任意の CPU」としてコンパイルされている場合、すべて正常に動作します。しかし、アセンブリが x86 としてコンパイルされている場合、リフレクション時に「これは Win32 アプリケーションではありません」という例外が発生します。これは明らかに、ホスト アプリが 64 ビットで実行されているためです。

私の質問は、どうすればこれを回避できますか? 何か考え/アイデアはありますか?

ありがとう

4

3 に答える 3

6

Ok。私はそれを考え出した。私の目的では、これはアセンブリの単純な型の検出であり、インスタンス化は行われていないため、Assembly.ReflectionOnlyLoad を使用すると、アセンブリが 32 ビットの場合に機能します。

Assembly.ReflectionOnlyLoad を使用してアセンブリをロードすると、型を反映することができます。AppDomain.CurrentDomain.ReflectionOnlyLoadResolve にもフックする必要があります。

属性名を取得するには、型、メソッド、またはモジュールで CustomAttributeData.GetCustomAttributes を使用する必要があります。

 static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
        Assembly assm = Assembly.ReflectionOnlyLoadFrom("TestProject1.dll");

        Type t = assm.GetType("TestProject1.ProgramTest");
        MethodInfo m = t.GetMethod("MainTest");

        IList<CustomAttributeData> data = CustomAttributeData.GetCustomAttributes(t);


    }

    static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
    {
        return Assembly.ReflectionOnlyLoad(args.Name);
    }
于 2009-06-11T19:50:07.510 に答える
0

反射の目的でのみロードする必要がある場合は、Mono.Cecilを使用できます。これで問題ないと思います。

または、dllのコピーを取得し、ファイルに対してcorflagsを実行して、32ビットのみのフラグを反転させてから、コピーをロードします。

1つ目は、リフレクトするだけではるかに優れて高速であり、タイプを実際にインスタンス化することは決してありませんが、本質的により多くの労力を必要とします。2つ目は、エラーが発生しやすいことです(dllは、リフレクションスキャンを介してトリガーされると、何があっても失敗するアンマネージコードに依存している可能性があります。

3番目に、問題を回避するための代替オプション。アプリを32ビットのみで実行するように強制すると、すべてが正常に読み込まれるはずです。本当に64ビットを実行する必要がありますか?

于 2009-06-11T18:03:43.540 に答える
0

ファイルをコピーしてビットを変更できます。

于 2009-06-11T17:51:11.730 に答える