【问题标题】:How to use FreeImage.NET in a x64 targeting project (AnyCpu)?如何在 x64 目标项目 (AnyCpu) 中使用 FreeImage.NET?
【发布时间】:2013-07-19 12:42:07
【问题描述】:

我正在尝试在我的项目中使用 FreeImage .NET 包装器,我的 ptoject 以 AnyCPU 为目标,而 dll 包装器在此下不起作用,它仅在我以 x86 机器为目标时才有效。

当我尝试使用面向 AnyCPU 或 X64 的包装器加载文件时,它会抛出此异常:

"Se ha intentado cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)" 

Translated:
"Intent to load a program with incorrect format (Excepción de HRESULT: 0x8007000B)"

我已尝试按照以下步骤在网络项目中使用 x64 freeimage:http://www.sambeauvois.be/blog/2010/05/freeimage-and-x64-projects-yes-you-can/

...但是我的VS2012无法打开任何解决方案,它说“找不到本地化资源”。

freeimage 和 wrapper 的来源在这里:http://downloads.sourceforge.net/freeimage/FreeImage3154.zip

我需要将 dll 转换为与 anycpu 目标一起使用,或其他解决方案使其工作,我正在使用 VBNET。

【问题讨论】:

    标签: c# .net vb.net freeimage target-platform


    【解决方案1】:

    最简单的解决方案是使用FreeImageNET nuget package。警告:我没有测试过这个;我不知道它是如何处理 32 位和 64 位的。

    您可以在解决方案资源管理器中执行此操作 - "Manage NuGet packages for Solution..."

    以下说明适用于希望自己构建 .NET 包装器的用户。


    澄清伯恩哈德的回答:

    要在 64 位项目中使用 FreeImage,仅将“.NET-wrapper”FreeImageNet.dll 编译为 64 位是不够的。
    还必须确保您使用的是 64 位版本的 FreeImage.dllFreeImage\Dist\x64\FreeImage.dll

    请注意,这不是“任何 CPU”解决方案。将您的主 exe 的项目平台设置为“x64”。

    在 64 位中构建 FreeImageNet.dll(在 VS 2019 Community 中测试):

    • http://freeimage.sourceforge.net/download.html 下载最新的"FreeImage DLL" [WIN32/WIN64] 存档。您不需要“源代码分发”,除非您想构建底层 C++ dll。在我写这篇文章的时候,你下载的文件是FreeImage3180Win32Win64.zip
    • 在VS中打开FreeImage\Wrapper\FreeImage.NET\cs\FreeImage.NET.sln;让它将项目格式转换为 2019。
    • 卸载UnitTest project(以避免由于缺少 NUnit 包而导致的错误)。
    • 将构建配置/平台设置为"x64"
    • 打开库/属性/构建 - 将 "Treat warnings as errors" 设置为 "None"。注意:必须为您构建的每个"Platform" 进行设置。因此,如果您忘记先设置 Build Platform,请在将 Build Platform 设置为 x64 后,验证这仍然是“None”。
    • 右键单击库项目/Build
    • 如果您想在调试应用程序时使用带有FreeImageNET.pdb 符号的调试版本,请同时为DebugRelease 构建配置。您需要 Release dll 用于您的应用的发布版本。
    • 任何引用此库的 .exe 也必须引用 FreeImage\Dist\x64\FreeImage.dll

    (可选)验证您是否可以在该 .sln 中构建和运行示例 1:

    • 将配置设置为Debug + x64;启动项目Sample 1.
    • 构建。如果你现在运行,它不会找到FreeImage.dll
    • 查找bin 文件夹现在包含Sample01.exe。这还应该包含您之前构建的FreeImageNet.dll 的副本。
    • 您需要 x64 版本的底层 C++ dll。将FreeImage\Dist\x64\FreeImage.dll 复制到您找到Sample01.exe 的文件夹中。
    • 在 Sample 的 Program / Main 方法的开始处设置断点。逐步检查,在控制台窗口中查找任何错误消息。最重要的是,确保 FreeImage.IsAvailable() 检查成功 - 不会说“FreeImage.dll 似乎丢失了”。

    现在您可以使用自己的应用重复此操作了:

    • 将主 exe 项目的配置设置为 Debug + x64
    • 构建。确保您知道要构建到哪个 bin 文件夹中。
    • FreeImage.dllFreeImageNET.dllFreeImageNET.pdb 复制到包含您的.exe 的文件夹中。
    • [可选] 将 FreeImage\Wrapper\FreeImage.NET\cs\Library\Library.csproj 添加到您的解决方案中。这是VS 2019早前为你打造的“2019格式”版本。这使得调试包装源变得容易。
    • 现在在您的 exe 项目中引用这两个 dll,并像往常一样调试您的项目。 (或将Library 项目作为依赖项,加上FreeImage.dll。)

    注意:将这些文件直接复制到您的 bin 文件夹是执行此操作的“肮脏”方式。是验证您可以使用 dll 构建和运行的最简单方法。更好的是让这些 dll 成为源代码控制下的“源”的一部分,作为构建过程的一部分复制到 bin 文件夹。谷歌其他地方的说明。

    【讨论】:

    • 感谢您的详细解释...非常有用。您能否添加一些有关 .NET 版本设置的信息?示例 01 设置为 .NET 2.0,我认为库设置为 3.5。是否有必要将这些设置为您的项目使用的版本,或者我们可以将其设置为 4,或者可能是 4.5.1 并期望它适用于所有 4.x.x 版本? (我记得当我过去有不匹配的版本时,解决方案资源管理器中有黄色警告图标......不确定这是否仍然是“事情”)再次感谢您的详细信息,仅供参考的说明也适用于 VS2017。
    • @AndrewMalcolm - 我不确定框架版本。我看到 WinMerge 的人在他们的 WinMerge github 中维护一个 freeimage 分支 - 看看他们做了什么。如果您有任何问题,他们可能会给您更好的建议。
    【解决方案2】:

    您需要将 freeimage 库和 .NET 包装器编译为 64 位。

    http://www.sambeauvois.be/blog/2010/05/freeimage-and-x64-projects-yes-you-can/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多