Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WatiN在x64系统上找不到任何浏览器_C#_Interop_64 Bit_Pinvoke_Watin - Fatal编程技术网

C# WatiN在x64系统上找不到任何浏览器

C# WatiN在x64系统上找不到任何浏览器,c#,interop,64-bit,pinvoke,watin,C#,Interop,64 Bit,Pinvoke,Watin,我在运行.NET应用程序的x64系统上看到一些奇怪的问题 我们的应用程序使用WatiN在基于浏览器的web应用程序上执行自动操作 在上述x64 Windows 7企业桌面上,WatiN无法找到打开的浏览器 我相信在内部,WatiN被编程为使用Win32 API枚举所有打开的窗口,并查看是否有符合给定标准的窗口 我的问题是:如果我的进程作为x86加载,我会在taskmgr中看到*32,调用标记为DllImport的某个方法。。。可能会加载x64版本吗?例如,EnumWindows是在User32.

我在运行.NET应用程序的x64系统上看到一些奇怪的问题

我们的应用程序使用WatiN在基于浏览器的web应用程序上执行自动操作

在上述x64 Windows 7企业桌面上,WatiN无法找到打开的浏览器

我相信在内部,WatiN被编程为使用Win32 API枚举所有打开的窗口,并查看是否有符合给定标准的窗口

我的问题是:如果我的进程作为x86加载,我会在taskmgr中看到*32,调用标记为DllImport的某个方法。。。可能会加载x64版本吗?例如,EnumWindows是在User32.dll中定义的,然后加载它的哪个版本?C:\Windows\System32或C:\Windows\SysWOW64中的一个

我们的应用程序是在x86配置中编译的,但是一些引用的程序集是在任何CPU中编译的

这是否会导致正确加载正确版本的x86/x64引用DLL/程序集的问题

编辑:添加加载模块的内存转储:

请注意,某些模块实际上是从Windows\SysWOW64加载的,而其他模块(如SHDocVW.dll)则是从C:\Windows\System32加载的

这是否可以指出该系统上32/64之间可能存在冲突

我已经调试了WatiN的代码,直到调用某个本机方法枚举windows时返回null,尽管某些IE窗口可用

如何进一步调试这个奇怪的问题

作为故障机器诊断测试的一部分,并非所有机器都会出现这种情况,我制作了一个简单的诊断应用程序,它引用了调用EnumWindows的库

大概是这样的:

DebugApp->DebugLib

每一个都是在x86和任何CPU中编译的,并对4种不同的组合进行了测试

我在我的桌面上运行了32位,这导致了4个相同的错误 产出。 在Windows Server 2008 R2 64位上,它创建了3个相同的输出, 和1运行崩溃的预期-64位EXE与32位库。 在发生故障的机器上,这创建了4个相同的文件,如 我的,这怎么可能?它应该导致应用程序崩溃!!
诊断后有什么想法吗?

它应该加载与正在运行的程序相同的程序,因此,如果您的程序正在32位运行,那么它将加载32位的程序,以此类推。。。您可以尝试在visual studio项目中强制执行32位,以查看这是否有帮助。如果应用程序exe是x86进程,但某些引用的程序集是在任何CPU配置中编译的,会发生什么情况?在运行执行某些COM互操作的代码时,这会导致问题吗?当然不是,我在64位COM中遇到的唯一问题是发送必须具有特定大小的结构,因为在64位中IntPtr的大小不同。另外,watin应该能够通过搜索进程或名称来获取windows的句柄,而不管它是32/64位的,因此如果它没有找到它,我的设置可能不正确,我以前就有过这个问题。您可以指定它使用的方法吗?由于类名等原因,枚举IE8窗口和IE9窗口时存在差异。另外,当您强制32位时,它是否工作?是否使用管理权限运行测试运行程序?我也有类似的问题,直到我没有以管理员身份运行NUnit。它应该加载与程序运行时相同的程序,因此如果您的程序运行在32位,那么它将加载32位的程序,等等。。。您可以尝试在visual studio项目中强制执行32位,以查看这是否有帮助。如果应用程序exe是x86进程,但某些引用的程序集是在任何CPU配置中编译的,会发生什么情况?在运行执行某些COM互操作的代码时,这会导致问题吗?当然不是,我在64位COM中遇到的唯一问题是发送必须具有特定大小的结构,因为在64位中IntPtr的大小不同。另外,watin应该能够通过搜索进程或名称来获取windows的句柄,而不管它是32/64位的,因此如果它没有找到它,我的设置可能不正确,我以前就有过这个问题。您可以指定它使用的方法吗?由于类名等原因,枚举IE8窗口和IE9窗口时存在差异。另外,当您强制32位时,它是否工作?是否使用管理权限运行测试运行程序?我也有类似的问题,直到我没有以管理员身份运行NUnit。