DriverPackagePreinstall工作在64位(编译为32位)

时间:2017-01-24 17:25:47

标签: c# windows-installer pinvoke 32bit-64bit drivers

有没有办法可以编译一个调用DriverPackagePreinstall()(使用Pinvoke)的应用程序,它可以在64位设备(Windows 7)上运行,即使它是针对的32位?

原因是它将作为更大应用程序(使用Windows Installer Project)的安装程序的一部分运行,该应用程序将以32位为目标,但也必须在64位平台上运行。

这是我的代码:

using System;
using System.Linq;
using System.Runtime.InteropServices;

namespace MyDriver
{
    class Program
    {
        static void Main(string[] args)
        {

            if (args.Count() == 0)
            {
                Console.WriteLine("Please specify filename!");
                return;
            }


            int result= DriverPackagePreinstall(args[0], 0);


            if (result == 0)
            {
                Console.WriteLine("Success");
            } else {
                Console.WriteLine("Error: 0x{0}", result.ToString("X8"));
            }

        }

        [DllImport("DIFxAPI.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern Int32 DriverPackagePreinstall(
            [MarshalAs(UnmanagedType.LPTStr)] string DriverPackageInfPath,
            Int32 Flags);

        }
    }
}

如果我构建此定位x86,并尝试在64位计算机上运行,​​则会收到错误E0000235ERROR_IN_WOW64)。如果我构建定位x64,则此错误消失。

现在我不介意将其编译两次,让安装程序根据要安装的平台决定安装哪个。但是,如果我尝试在包含64位版本的同时构建安装程序,则会收到错误,

263 File 'MyDriver.x64.exe' targeting 'AMD64' is not compatible with the project's target platform 'x86'

另一种方法是让安装程序在构建时忽略此错误(并在项目安装时运行它)会很好。

1 个答案:

答案 0 :(得分:0)

我通过将64位和32位版本的应用程序添加到自解压zip文件以及批处理文件来解决这个问题,该文件决定执行哪一个。

自提取器是一个32位的exe,所以只要没有人告诉Visual Studio它包含一个64位的,它就可以工作。