.NET AnyCPU项目链接平台特定库

5

可能是重复问题:
Loading x86 or x64 assembly

我正在尝试编译Any CPU .NET项目,但我需要链接SQLite库,该库在x86和x64平台上有不同版本。仅将DLL版本更改为x64无法解决问题,应用程序无法启动,我需要使用x64引用重新编译代码。 当我添加x86和x64两种引用时,由于冲突而无法编译。 我不能使用x86编译应用程序,因为我正在使用的其中一个系统COM库在WOW64下无法工作。

所有32位VSS应用程序(请求器、提供程序和编写者)必须作为本机32位或64位应用程序运行。在WOW64下运行它们不受支持

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

因此,我需要构建Any CPU项目,但我目前看到的此问题的唯一解决方案是针对x86和x64制作重复项目。是否还有更好的解决方法?

更新

当我在项目中引用x64库,但尝试加载x86库时,会收到以下异常。

The located assembly's manifest definition does not match the assembly reference.


谢谢。我看过类似的帖子,但问题是仅更改DLL并没有太大帮助。当我将64位DLL复制到我的文件夹中时,它仍然无法工作,我仍然需要重新编译引用这些64位库的应用程序。我做错了什么吗?我也不明白应该引用哪个版本? - axe
1
是的。本机库必须具有相同的名称,但必须位于不同的文件夹中(例如应用程序的子文件夹)。在运行时,您调用SetDllDirectory使操作系统查找正确的文件夹,具体取决于位数。或者像Rover建议的那样使用AppDomain.CurrentDomain.AssemblyResolve事件。您不直接引用这些库,而是使用SQLite托管封装器来做到这一点。您的代码将使封装器加载底层本机库的正确版本。 - GSerg
我尝试了一次,但它对我无效。应用程序在启动时崩溃。问题是我在项目中引用了x64库,但我在运行时选择了x86库。如果我使用x86库构建我的应用程序,则在x86 Windows上完美运行,否则就不行。 - axe
抱歉,是我的错。实际上我刚刚从互联网下载了64位版本,但32位版本有点旧。他们已经上传了新版本,而我没有注意到。 谢谢,问题已关闭。 - axe
1
@axe 然后发布一个描述你所做的答案,并接受它。 - CodesInChaos
1个回答

6

主要问题在于我在x86和x64中使用了不同版本的SQLite。

我添加了一个方法。

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args)
{
    string platform = Environment.Is64BitProcess ? "x64" : "x86";
    string assemblyName = new AssemblyName(args.Name).Name;
    string assemblyPath = Path.Combine(
        Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll");

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath);
}

并设置事件处理程序

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve;

在主应用程序入口点。现在它会分别为x86平台加载x86汇编和64位平台上的x64汇编。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接