首页 新闻 会员 周边 捐助

在XP和Win2003 64位环境下用32位C#程序反射加载系统目录中用C++编写的32位托管程序集

0
悬赏园豆:30 [已关闭问题]

打完这行标题手都酸了,但是没办法,这个怪异的问题就是这么麻烦,而且很是难以重现。

下面是重现这个问题的步骤:

1.用VS新建一个C++(我对C++知之甚少,也不知道应该叫做托管C++还是C++/CLI,所以我就干脆直呼其名为C++了)的类库工程。用X86编译,把编译出的dll文件保存好备用,假设这个dll文件叫做CPPTest.dll吧。

2.找一个64位的XP或者Win2003的环境(64位的Win7中不会出现问题,64位的Vista我没测试过)。在其sysWOW64文件夹下新建一个文件夹,权且叫做test吧,将第一步中用C++编写的32位程序集复制到这个test文件夹下。

3.用VS新建C#的Console工程,用X86的编译选项。写如下代码:

String path=@"C:\Windows\System32\test\CPPTest.dll";
If(File.Exists(path))
{
Assembly.LoadFrom(path);
}

单步一下,发现File.Exists(path)会返回true,但是我们之前是把C++编写的程序集放在sysWOW64下的,System32下是没有这个文件的。


不过这还不是怪异之所在,因为在64位Windows环境下运行的32位程序中所有对System32目录的访问都会被重定向到sysWOW64,所以这里判断CPPTest.dll文件存在倒是正确行为。既然文件存在,那么接下来加载理应是可以执行通过的,但是Assembly.LoadFrom(path)这一句抛了异常,说是无法加载程序集,这的确是有点奇怪了。

如果把CPPTest.dll文件放到任何其他的地方来加载,都不会出现问题。
如果把C#的Console程序的编译选项改为X64或AnyCup都不会出现问题。
在64位的Win7下也不会出现问题。

但是,这还不是最怪异的地方。去System32下新建一个叫做test的空文件夹,只是空文件夹而已。再次执行一下,竟然跑过了!

有哪位知道为什么会出现这种状况吗?
请各位帮忙分析,谢谢!

崔鹏飞的主页 崔鹏飞 | 初学一级 | 园豆:140
提问于:2010-06-12 21:10
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册