有没有办法可以编译一个调用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位计算机上运行,则会收到错误E0000235
(ERROR_IN_WOW64
)。如果我构建定位x64,则此错误消失。
现在我不介意将其编译两次,让安装程序根据要安装的平台决定安装哪个。但是,如果我尝试在包含64位版本的同时构建安装程序,则会收到错误,
263 File 'MyDriver.x64.exe' targeting 'AMD64' is not compatible with the project's target platform 'x86'
另一种方法是让安装程序在构建时忽略此错误(并在项目安装时运行它)会很好。
答案 0 :(得分:0)
我通过将64位和32位版本的应用程序添加到自解压zip文件以及批处理文件来解决这个问题,该文件决定执行哪一个。
自提取器是一个32位的exe,所以只要没有人告诉Visual Studio它包含一个64位的,它就可以工作。