具有32位依赖性的64位WCF服务

时间:2016-12-11 05:18:24

标签: c# .net web-services wcf

我有一个WCF服务和一个库,都是为x64编译的。该库有一些NuGet包,它们出现了#34;是32位。当我尝试运行或发布WCF服务时,我得到System.BadImageFormatException,但奇怪的是,我没有收到任何关于不匹配架构的警告。

错误的全文: Additional information: Could not load file or assembly 'Library' or one of its dependencies. An attempt was made to load a program with an incorrect format.

作为测试,我创建了一个单独的控制台应用程序,添加了对库的引用,为控制台应用程序和库x64构建了体系结构,并运行了控制台应用程序。同样的错误。

WCF服务应用程序将托管在IIS中,并正在使用WCF测试客户端进行调试。

我正在使用的NuGet包是:

  • CsvHelper(Josh Close),v2.16.3
  • Newtonsoft.Json(James Newton-King),v9.0.1

我需要能够以64位模式运行服务和库,因为我使用的是非常大的数据集,并且需要额外的RAM。我的问题是

  • 我的问题是没有为x64编译NuGet包吗?
  • 如何在此设置中运行此WCF服务?

1 个答案:

答案 0 :(得分:1)

我的问题很多部分:

  1. 我确实需要重新编译我用于x64的库。它们是针对Any CPU编译的,运行时环境在加载显式x64程序集后不喜欢它。
  2. DLL Hell
  3. IIS以32位模式运行。
  4. 第一期:

    我从GitHub下载了两个库的源代码,并为x64重建。我将条件编译添加到项目文件中的程序集引用,以便于在x64和x86之间来回切换:

    <Reference Include="CsvHelper" Condition="'$(Platform)' == 'x86'">
      <HintPath>..\..\..\libraries\x86\CsvHelper\CsvHelper.dll</HintPath>
    </Reference>
    <Reference Include="CsvHelper" Condition="'$(Platform)' == 'x64'">
      <HintPath>..\..\..\libraries\x64\CsvHelper\CsvHelper.dll</HintPath>
    </Reference>
    

    为了验证我的程序集实际上是x64,我发现this answer非常有用。该实用程序可以从Visual Studio Developer Command Prompt运行。

    第二期:

    由于我正在处理一个大型代码库(42个项目),我不得不做一个彻底的清理,以摆脱从某个地方复制的x86程序集。通过Visual Studio清理没有帮助;我必须clean我的Git存储库来摆脱所有旧的DLL。如果Git忽略bin和obj文件夹,清理只会有帮助。

    第三期:

    我(最终)发现this帖子(在此步骤之后关闭并重新打开您的项目/解决方案/ Visual Studio也是必要的)。也可以按照here指示访问此设置。更新此设置后,我不得不重新启动IIS。有关该说明,请参见MSDN。我将补充一点,在执行该命令之前首先使用提升的权限启动单独的命令提示符可能会有所帮助,否则运行窗口打开的命令提示符会快速闪烁,以便看到它中出现的内容。