理解平台目标

3

我在使用WPF应用程序时遇到了处理未管理的程序集的问题。这是我的设置,简化成一个简单的草图:

X64 RUNTIME____________________
|                              |
| AS_EXEC (executing Assy, x86)|
|   |                          |
|   |                          |
|   AS_INT (interfaces, AnyCpu)|
|   |                          |
|   |                          |
|   AS_WRA_1 (wrapper, x86)    |
|   | |                        |
|   | AS_UNM_1 (unmanaged, x86)|
|   |                          |
|   AS_WRA_2 (wrapper, x64)    |
|   | |                        |
|   | AS_UNM_2 (unmanaged, x64)|
|   |                          |
|   AS_WRA_3 (wrapper, x86)    |
|     |                        |
|     AS_UNM_3 (unmanaged, x86)|
|______________________________|

我想要做的是测试AS_WRA_1
由于AS_WRA_1引用的非托管代码仅在X86下工作,因此我认为最好将该项目设置为X86本身 - 只是为了防止使用会导致BadImageFormat异常的方法。 AS_INT包含所有AS_WRA实现的接口,并设置为ANY CPU
我在64位运行时中,所以我也将AS_EXEC设置为X86AS_WRA_2只能在64位下工作,AS_WRA_3只能在32位下工作(这基本上意味着我不能同时运行它们,但由于我只想测试AS_WRA_1,所以我忽略了这一点)。
在运行时,我使用反射从用户在UI中选择的包装器创建一个实例。奇怪的是,结果如下:
我可以从AS_WRA_2创建实例
对于AS_WRA_1AS_WRA_3,我得到了BadImageFormatExceptions
这正好与我的预期相反...我在这里做错了什么?

我猜你的AS_INT会是x64,因为你在一台x64的机器上(据我所知,底层操作系统平台被使用),这可能会导致BadImageException。我也遇到过几次这种情况,不得不显式设置平台才能使其正常工作。 - inva
设置它,但结果更加令人困惑:我的应用程序甚至无法启动,并且在AS_INT处失败,出现了一个BadImageFormatException异常。AS_INT没有外部引用,只有几个接口。 - Sebastian Edelmeier
根据此链接,我的应用程序作为64位进程启动,尽管我将其设置为编译为“X86”。这是我的错误:在配置管理器中,AS_EXEC被设置为X86,但在项目设置中仍然设置为目标ANY CPU。糟糕。 - Sebastian Edelmeier
1个回答

0

如果你有一个用x86 (Assy)编译的可执行文件,它将始终在x86中运行,并且它的所有依赖项必须在x86或AnyCpu中(它们也将在x86中执行)。

你无法同时在x86和x64中执行非托管资源的可执行文件,因此你将无法从Assy访问AS_UNM_1和AS_UNM_2,因为AS_UNM_2是x64而Assy是x86。由于Assy调用AS_INT,所以它也变成了x86。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接