了解平台目标

时间:2012-08-27 09:27:18

标签: c# visual-studio-2010 x86 64-bit platform

我在使用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的使用{1}}例外。

  • AS_INT包含所有AS_WRA实施的接口,并设置为ANY CPU

  • 我处于64位运行时,因此我还将AS_EXEC设置为X86

  • AS_WRA_2仅适用于64位,AS_WRA_3 32位(这意味着我基本上不能同时运行它们,但因为我只想测试AS_WRA_1,我或多或少高兴地忽略了 - 欢迎回来,DLL地狱!)。

在运行时,我使用反射从用户在UI中选择的包装器创建实例。奇怪的是,结果如下:

  • 我可以从AS_WRA_2
  • 创建实例
  • 我为AS_WRA_1AS_WRA_3获取BadImageFormatExceptions。

这与我的预期正好相反......我在这里做错了什么?

1 个答案:

答案 0 :(得分: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。