为什么我可以从在64位模式下运行的AnyCPU .NET Web应用程序中调用32位COM库?

4

在不使用COM+代理服务的情况下,我可以很愉快地在以AnyCPU为目标编译的.NET应用程序中,从64位w3wp进程中使用32位COM互操作库的类。

我成功地在64位.NET进程中实例化了来自32位COM互操作库的类。

w3wp正在以64位模式运行,并且IIS配置设置为不允许32位应用程序。此外,事实上有一个专门的x64编译和注册的.NET程序集。

我只是想知道,这到底是怎么可能的?

值得注意的是,如果使用Visual Studio 2008编译代码,以3.5框架为目标,则此方法非常有效。如果使用Visual Studio 2010编译相同的代码,以3.5框架为目标,则应用程序在尝试加载32位COM互操作库时将失败。正如它应该做的。


w3wp进程可以在32位模式下运行,因此可以处理32位程序集。 - Kangkan
抱歉,我以为这个信息从编译器的选择中已经很明显了——Visual Studio 2008是"有效"版本所使用的,而Visual Studio 2010是出问题版本所使用的。 - J. Steen
目标是使用 MSBuild4,就我所知,VS2010 总是使用它,对吗? - J. Steen
你好,想问一下,你使用的 COM 库是 InProc 还是 Out of Process 库(比如像 Word、Excel 互操作那样启动自己的进程)? - Kev
@Kev,这是项目中的二进制引用,并且类会立即实例化。InProc。 - J. Steen
显示剩余2条评论
5个回答

3

如果它正在运行,它将以32位模式运行,您不能在64位进程中拥有32位内容,反之亦然。进程完全是一种或另一种。

这与在64位主机上运行32位进程不同,显然,那样可以运行。

另一个选择是第三方提供的东西实际上是提供64位引用,您对其运行32位的结论是不正确的。


在任务管理器中,w3wp.exe旁边没有小的32位标记。 - J. Steen
另外,请解释一下为什么使用.NET4编译时会失败,而使用.NET2编译时不会。=) - J. Steen
现在,这是我几天以来得到的第一个好提示。但是,这将要求我将应用程序中所有链接和引用的程序集更改为4.0框架版本,对吗? - J. Steen
没错。我的做法是使用Visual Studio 2010编译,目标为3.5。 - J. Steen
是的,我知道这是位数的问题。这就是我的问题所在。=)别担心,我只是困惑为什么它可以在一个版本的Visual Studio中工作,而在另一个版本中却不能。 - J. Steen
显示剩余4条评论

1

你。不。是。

重点。

将Web应用程序设置为32位模式。这实际上是根据MS IIS指南应该运行的方式(大多数人从未费心阅读)。


不是这样,你没有看到我的真正问题 - 我已经能做到了。那怎么可能呢? - J. Steen
@TomTom,你能否提供一下那个指南的链接,说明要在32位模式下运行Web应用程序池吗? - Yiğit Yener
@Yiğit Yener:应用程序池应该在32位模式下运行并不是一个指南,而是一个向后兼容的功能,已经有文档记录。请参见:http://learn.iis.net/page.aspx/201/32-bit-mode-worker-processes/ - Kangkan
不,这只是一条指南。在慢速64位模式下运行工作进程在IIS中很少有意义——Web应用程序不应该变得那么大。请阅读托管指南。而且,32位和64位无法互操作。 - TomTom

1

w3wp进程可以在32位模式下运行,因此可以处理32位程序集。请查看您的IIS服务是否以32位模式运行。


再说一遍,这不是问题。使用 VS2008 编译时,在未启用 32 位的情况下,在 64 位上可以正常运行。但在使用 VS2010 编译时则不行。 - J. Steen

1

我会将这归咎于解决方案所包含的大量代码和项目中的某些复杂性。消除有问题的库需要64位的要求解决了问题,但自然而然地并没有回答这个问题。它只是使其过时了。


0

它通过 DllSurrogate 机制工作,当您尝试加载错误位数的 com-dll 时,会自动创建 DllHost 进程。在这些情况下,您将获得隐式进程间通信。只需查看 main。


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