为什么我必须运行控制台应用程序x86才能看到COM DLL,而ASP.NET可以运行AnyCPU?

时间:2013-03-28 15:17:21

标签: asp.net .net com

我正在运行64位Windows 7,Studio 2012,并且不完全了解以下行为:

      
  1. 我通过regsvr32注册第三方COM dll
  2.   

      
  3. 我创建了一个ASP.Net项目。
  4.     
            
    • 我引用了COM类型库
    •       
    • 我将目标CPU设置为“AnyCPU”
    •        
    • 一切都编译好了
    •     
      

      
  5. 我创建了一个控制台应用
  6.     
            
    • 我引用了COM类型库
    •       
    • 我将目标CPU设置为“AnyCPU”
    •       
    • 它编译,但我收到运行时错误“COM库未注册。”
    •       
    • 我将目标CPU切换到x86,运行正常。     

    将站点部署到IIS时,我必须在应用程序池中“启用32位应用程序”才能使用它。 也许这是在Visual Studio开发服务器中自动完成的。

    Visual Studio开发服务器是否只是在幕后32位运行我的网站,还是有更深层次的工作?

2 个答案:

答案 0 :(得分:4)

是的,您的网络服务器将您的网站作为32位应用运行。

答案 1 :(得分:3)

在IIS中启用“32位应用程序”启动w3wp进程的x86版本。

AnyCPU是一个方便的功能,由.NET提供,决定应用程序启动选择哪种处理器架构。这是可能的,因为.NET应用程序不能编译为x86 / x64机器代码,而是编译为Intermediate Language。启动应用程序时,它会在后台编译为x64或x86机器代码。

但是,非.NET应用程序通常直接编译为目标系统的机器代码。此外,COM服务器必须在x86和x64的不同注册表分支中注册。

由于您只有32位兼容服务器(DLL),这会导致您所描述的情况:

  1. 使用AnyCPU启动控制台应用程序时,它会根据系统使用的体系结构编译为x86或x64。在此之后,引用被加载。如果您使用的是x64,则该进程无法找到服务器的COM工厂。否则一切都会好起来的。这就是你永远不应该将AnyCPU 与COM引用一起使用的原因。
  2. IIS只能以两种模式运行:显式x86或x64(默认)。启用“32位应用程序”会导致x86进程,该进程以x86模式加载Web应用程序。当您使用“AnyCPU”时,您的COM引用很好。但是,如果由于某种原因禁用“32位应用程序”,则会遇到麻烦。将“x64”设置为目标平台将产生BadImageFormatException