我创建一个使用AnyCPU建立了一个ADO.NET数据提供程序。当直接引用时,它可以在64位和32位Windows操作系统上正常工作。但是,在我的安装程序中,我使用.NET machine.config注册了我的DbProviderFactory,并将我的程序集放入GAC,以便用户可以通过System.Windows.DbProviderFactories访问数据提供程序。只要应用程序以32位的方式运行,此功能就很有用。它不适用于为x64构建的应用程序。启动64位进程修改32位和64位.NET machine.config中
这就是我发现的。我的安装程序针对32位。因此,我的DbProviderFactory仅被添加到32位.NET machine.config。为了让x64应用程序通过DbProviderFactory使用我的数据提供程序,它需要使用64位.NET machine.config进行注册。
我必须有两个安装程序?一个定位32,另一个定位64?我所有的程序集都是AnyCPU(因为我不知道或关心用户的应用程序是什么平台)。
我有点复杂的解决方案是这样的。在安装程序期间,我有自定义操作来检查操作系统是否是64位(here)。如果是这样,我想启动一个运行64位控制台应用程序的进程,该应用程序会将我的DbProviderFactory添加到machine.config(64位)。而我的安装程序本身也会在32位的machine.config中注册。我试过了,但是失败了,因为在32位目标设置项目中无法使用64位程序集。但是,我将尝试使用AnyCPU构建控制台应用程序,假定它将在64位操作系统上作为64位进程运行。
这是相当混乱的,但我认为它会工作。为什么这是一个坏主意?微软为什么要说:“要将.NET Framework应用程序分发到32位和64位平台,需要构建两个MSI包,一个是32位的,另一个是64位的计算机”(msdn)。它会工作,因为技术上我所有的组件都是AnyCPU?
而且,我使用.NET 3.5
我不确定它会起作用,因为32位msi安装程序是作为32位进程启动的。这应该导致AnyCPU DLL以32位运行(AnyCPU DLL在32位进程内运行)。因此需要有一个64位和32位MSI安装程序。 –
我想让32位msi安装程序启动一个执行AnyCPU控制台应用程序(exe)的_new_进程,但前提是我们在64位操作系统上。理论上这个新的过程应该以64位的方式运行(并且可以访问64位的machine.config)。 – codyzu
MSI严重依赖比特率。也许他们会在某一天改进,可能在没有人再安装32位操作系统的时候。只需要运行两次安装是一个非常低的痛苦解决方案。无论如何。 –