2011-08-05 132 views
0

我创建一个使用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

+0

我不确定它会起作用,因为32位msi安装程序是作为32位进程启动的。这应该导致AnyCPU DLL以32位运行(AnyCPU DLL在32位进程内运行)。因此需要有一个64位和32位MSI安装程序。 –

+0

我想让32位msi安装程序启动一个执行AnyCPU控制台应用程序(exe)的_new_进程,但前提是我们在64位操作系统上。理论上这个新的过程应该以64位的方式运行(并且可以访问64位的machine.config)。 – codyzu

+0

MSI严重依赖比特率。也许他们会在某一天改进,可能在没有人再安装32位操作系统的时候。只需要运行两次安装是一个非常低的痛苦解决方案。无论如何。 –

回答

1

回答我的问题:

1)我不需要32位和64位的安装程序。但是,这仅仅是因为我的所有程序集都是AnyCPU。

2)这不是一个坏主意,相反,它是一个好主意,因为我只需要一个安装程序分发到客户端,并奇迹般地瓶坯额外安装64位的机器操作。

3)我认为如果程序集或包含的引用是为32位或64位显式构建的,M $表示拥有两个安装程序。

最终的溶液:以我的32位的安装程序,我注册在machine.config组装。然后我检查操作系统是否是64位(使用提供我的问题的链接)。如果是这样,我启动一个命令行实用程序(包含在我的安装程序中),它是为AnyCPU构建的独立进程。该实用程序将我的程序集注册到64位machine.config中。这是有效的,因为AnyCPU实用程序只在64位操作系统上作为新进程启动,假设它将默认为64位进程。完成。