C# 如何在x64目标项目(AnyCpu)中使用FreeImage.NET?

C# 如何在x64目标项目(AnyCpu)中使用FreeImage.NET?,c#,.net,vb.net,freeimage,target-platform,C#,.net,Vb.net,Freeimage,Target Platform,我正在尝试在我的项目中使用FreeImage.NET包装器,我的ptoject目标是AnyCPU,而dll包装器在这种情况下不起作用,它只在我目标是x86机器时起作用 当我尝试使用针对任何CPU或X64的包装器加载文件时,它会引发以下异常: "Se ha intentado cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)" Translated: "Intent to load

我正在尝试在我的项目中使用FreeImage.NET包装器,我的ptoject目标是AnyCPU,而dll包装器在这种情况下不起作用,它只在我目标是x86机器时起作用

当我尝试使用针对任何CPU或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:

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

freeimage和包装器的来源如下:


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

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


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


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

您可以在解决方案资源管理器中执行此操作-管理解决方案的NuGet软件包

下面的说明适用于那些希望自己构建.NET包装器的人

为了澄清伯恩哈德的答案:

要在64位项目中使用FreeImage,仅将.NET包装程序FreeImageNet.dll编译为64位是不够的。 还必须确保您使用的是64位版本的FreeImage.dll,即FreeImage\Dist\x64\FreeImage.dll

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

要在VS 2019社区中以64位测试格式构建FreeImageNet.dll,请执行以下操作:

从下载最新的FreeImage DLL[WIN32/WIN64]存档。您不需要源分布,除非您想构建基础C++ DLL。在我写这篇文章时,您下载的文件是FreeImage3180Win32Win64.zip。 在VS中打开FreeImage\Wrapper\FreeImage.NET\cs\FreeImage.NET.sln;让它将项目格式转换为2019。 卸载UnitTest项目以避免由于缺少NUnit包而导致的错误。 将构建配置/平台设置为x64。 打开库/Properties/Build-Set将警告视为错误,设置为“无”。注意:这必须为您构建的每个平台设置。所以,如果您忘记先设置Build Platform,在将Build Platform设置为x64之后,请验证它是否仍然为None。 Rt单击库项目/构建。 如果您想在调试应用程序时将调试版本及其FreeImageNET.pdb用于符号,请对调试和发布版本配置执行此操作。您将需要应用程序发布版本的发布dll。 引用此库的任何.exe也必须引用FreeImage\Dist\x64\FreeImage.dll。 (可选)验证是否可以在其中生成和运行示例1。sln:

将config设置为Debug+x64;启动项目示例1。 建筑如果现在运行,它将找不到FreeImage.dll。 查找当前包含Sample01.exe的bin文件夹。它还应该包含您以前构建的FreeImageNet.dll的副本。 您需要底层的C++ DLL的X64版本。将FreeImage\Dist\x64\FreeImage.dll复制到找到Sample01.exe的文件夹中。 在示例程序/Main方法的开始处设置断点。步骤至,在控制台窗口中查找任何错误消息。最重要的是,确保FreeImage.IsAvailable检查成功-但不要说FreeImage.dll似乎缺失。 现在,您可以使用自己的应用程序重复此操作:

将主exe项目的配置设置为Debug+x64。 建筑以确保您知道要构建到哪个bin文件夹中。 将FreeImage.dll、FreeImageNET.dll和FreeImageNET.pdb复制到包含.exe的文件夹中。 [可选]将FreeImage\Wrapper\FreeImage.NET\cs\Library\Library.csproj添加到解决方案中。这是VS 2019之前为您创建的2019格式版本。这使得调试到包装器源代码变得很容易。 现在在exe项目中引用两个DLL,并像往常一样调试项目。或者将库项目作为依赖项引用,再加上FreeImage.dll。
注意:将这些文件直接复制到您的bin文件夹是一种肮脏的方法。这是验证您可以使用DLL构建和运行的最简单的方法。更好的方法是将这些DLL作为源代码控制下的源代码的一部分,作为构建过程的一部分复制到bin文件夹。谷歌其他地方的说明。最简单的解决方案是使用。警告:我还没有测试过这个;我不知道它是如何处理32位和64位的

您可以在解决方案资源管理器中执行此操作-管理解决方案的NuGet软件包

下面的说明适用于那些希望自己构建.NET包装器的人

为了澄清伯恩哈德的答案:

要在64位项目中使用FreeImage,仅将.NET包装程序FreeImageNet.dll编译为64位是不够的。 还必须确保您使用的是64位版本的FreeImage.dll,即FreeImage\Dist\x64\FreeImage.dll

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

要在VS 2019社区中以64位测试格式构建FreeImageNet.dll,请执行以下操作:

下载洛杉矶 从中测试FreeImage DLL[WIN32/WIN64]存档。您不需要源分布,除非您想构建基础C++ DLL。在我写这篇文章时,您下载的文件是FreeImage3180Win32Win64.zip。 在VS中打开FreeImage\Wrapper\FreeImage.NET\cs\FreeImage.NET.sln;让它将项目格式转换为2019。 卸载UnitTest项目以避免由于缺少NUnit包而导致的错误。 将构建配置/平台设置为x64。 打开库/Properties/Build-Set将警告视为错误,设置为“无”。注意:这必须为您构建的每个平台设置。所以,如果您忘记先设置Build Platform,在将Build Platform设置为x64之后,请验证它是否仍然为None。 Rt单击库项目/构建。 如果您想在调试应用程序时将调试版本及其FreeImageNET.pdb用于符号,请对调试和发布版本配置执行此操作。您将需要应用程序发布版本的发布dll。 引用此库的任何.exe也必须引用FreeImage\Dist\x64\FreeImage.dll。 (可选)验证是否可以在其中生成和运行示例1。sln:

将config设置为Debug+x64;启动项目示例1。 建筑如果现在运行,它将找不到FreeImage.dll。 查找当前包含Sample01.exe的bin文件夹。它还应该包含您以前构建的FreeImageNet.dll的副本。 您需要底层的C++ DLL的X64版本。将FreeImage\Dist\x64\FreeImage.dll复制到找到Sample01.exe的文件夹中。 在示例程序/Main方法的开始处设置断点。步骤至,在控制台窗口中查找任何错误消息。最重要的是,确保FreeImage.IsAvailable检查成功-但不要说FreeImage.dll似乎缺失。 现在,您可以使用自己的应用程序重复此操作:

将主exe项目的配置设置为Debug+x64。 建筑以确保您知道要构建到哪个bin文件夹中。 将FreeImage.dll、FreeImageNET.dll和FreeImageNET.pdb复制到包含.exe的文件夹中。 [可选]将FreeImage\Wrapper\FreeImage.NET\cs\Library\Library.csproj添加到解决方案中。这是VS 2019之前为您创建的2019格式版本。这使得调试到包装器源代码变得很容易。 现在在exe项目中引用两个DLL,并像往常一样调试项目。或者将库项目作为依赖项引用,再加上FreeImage.dll。
注意:将这些文件直接复制到您的bin文件夹是一种肮脏的方法。这是验证您可以使用DLL构建和运行的最简单的方法。更好的方法是将这些DLL作为源代码控制下的源代码的一部分,作为构建过程的一部分复制到bin文件夹。请在其他地方搜索相关说明。

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