有人解决了这个问题吗?
是的,微软有。他们需要为他们的 SQL Server Compact 包解决同样的问题。它有一个托管程序集 System.Data.SqlServerCe.dll,充当托管程序的适配器,以及一堆实现实际数据库引擎的本机 DLL。我不推荐它们绑定到本机 DLL 入口点的方式,我会假设您使用 pinvoke。我建议你使用this technique 以确保客户端程序可以运行AnyCPU。
重复那篇文章的本质,你想在初始化方法或静态构造函数的某个地方执行这段代码:
public static void SetupDatabaseBinaries() {
var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
path = Path.Combine(path, IntPtr.Size == 8 ? "amd64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetDllDirectory(string path);
唯一重要的步骤是让用户的项目将本机 DLL 复制到项目的 amd64/x86 目录中。这需要一个后期构建步骤,就像 Compact 包所做的那样。你需要下载 Nuget 包来看看他们是怎么做到的,这不是很简单。运行 VS 提升,创建一个虚拟控制台模式项目并检索 Sql Server Compact 的 Nuget 包。安装后,使用 Project + Properties,Build events 选项卡并注意它是如何添加此构建后事件的:
if not exist "$(TargetDir)x86" md "$(TargetDir)x86"
xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86"
if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64"
xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64"
没什么大不了的,除了创建 x86 和 amd64 子目录并将 DLL 复制到其中之外,它什么也不做。棘手的部分是让您的 Nuget 包添加此构建事件。查看包文件夹,了解实现此目的的魔法。您可能希望尽可能地遵循该示例以避免错误。查看 packages\Microsoft.SqlServer.Compact.4.0.8876.1\tools 目录,它包含两个执行此操作的 PowerShell 脚本文件。 Install.ps1 在安装结束时运行。创建后期构建步骤的函数在 VS.psm1, Add-PostBuildEvent 中。祝你好运。