在x64位操作系统上从“Any CPU”构建的应用程序反映x86程序集

时间:2009-06-11 17:45:19

标签: .net reflection 64-bit 32-bit

我有一个编译为“任何CPU”的.Net应用程序。我在x64操作系统上运行它,因此它以64位运行。应用程序加载用户提供的其他程序集。它当然使用反射来从用户提供的程序集中读取类型。如果用户程序集编译为“任何CPU”,一切正常。但是如果程序集被编译为x86,我会在反射时得到“这不是Win32应用程序”异常。这显然是因为主机应用程序运行64位。

我的问题是,我该如何解决这个问题?有什么想法/想法吗?

由于

3 个答案:

答案 0 :(得分:5)

确定。我想到了。对于我的目的,这只是程序集的简单类型发现但没有实例化,如果程序集是32位,则使用Assembly.ReflectionOnlyLoad。

使用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);
    }

答案 1 :(得分:0)

您可以复制文件并更改位。

答案 2 :(得分:0)

如果您只是为了反射目的而需要加载它,您可以使用Mono.Cecil我认为应该没问题。

或者抓取dll的副本,对文件运行corflags以翻转仅32位标志,然后加载副本。

第一个更好and faster只是反映,从不想实际实例化一个类型,但本身就更多的努力。第二个是容易出错的(dll可能依赖于非托管代码,当通过反射扫描触发时,无论如何都会失败。

作为第三个备选方案来回避问题。只需强制你的应用程序只运行32位,然后它应该加载一切就好了。你真的必须运行64位吗?