3

我的 WCF 服务中出现以下运行时错误。

Could not load file or assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

环顾四周后,我发现了使用Assembly Binding Log ViewerProcess Monitor的建议。两者都没有或没有产生任何信息(也就是说,日志查看器根本没有显示任何内容,并且进程查看器没有看到正在尝试加载程序集。

我终于遇到了一个建议,使用这个实用程序(dependency walker)来找出程序集实际在寻找什么。打开时,我立即收到错误;日志说明如下:

错误:发现具有不同 CPU 类型的模块。警告:至少没有找到一个延迟加载依赖模块。警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。

Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

根据模块列表,它找不到这些:

API-MS-WIN-CORE-COM-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
DCOMP.DLL
IESHIMS.DLL

其中一些看起来与 RT 框架有关;但是,此应用程序是在 .NET 3.5 中开发的(实际上,这并不完全正确 - 它是在 4.5 中开发并降级到 3.5)。

查看其中一些文件似乎暗示它们是相当核心的 Windows 文件,奇怪的是,我在解决方案的其他地方(诚然在客户端)使用了这个 dll 没有问题。

我正在使用 VS2013,尽管我已经尝试过 VS2012 并遇到了同样的问题。

我确实遇到过这个问题,乍一看似乎是一样的,尽管它与 C++ 有关。

谁能给我一些关于问题可能是什么或接下来要尝试什么的指导?

这是我的融合日志:

=== Pre-bind state information ===
LOG: DisplayName = MyAssembly.MyLib.XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=MSIL (Fully-specified)
LOG: Appbase = file:///c:/myprog/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = myprog.exe
Calling assembly : System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: c:\myprog\bin\Debug\myprog.exe.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).

我设法减少了有问题的库,直到它只是一个返回字符串的静态函数,并且仍然得到错误。

4

8 回答 8

3

带有 WCF 的 Visual Studio 有一个怪癖 - 如果您使用选定的平台进行构建,它会将程序集转储到特定于平台的文件夹中。如果您使用“任何 CPU”构建它,它会将其放在 WCF 的“Bin”文件夹的根目录中。

什么时候配置IIS来帮你?它会自动假定您的程序集将位于该“Bin”文件夹的根目录中。

最终结果是,当您选择“x86”而不是“任何 CPU”时,您最终会在错误的位置构建程序集,并且您的 WCF 突然无法运行。因此,这是少数罕见的情况之一,其中关于无法加载文件或程序集的包罗万象的错误说明了字面意思 - Visual Studio 将您的程序集放在错误的位置,现在找不到它。

我不知道他们为什么那样做。WCF 有一些……有趣的设计决策。

于 2013-11-05T20:13:57.920 回答
3

始终帮助我解决此错误的事情是仔细查看错误消息中显示“或其依赖项之一”的部分。

于 2013-11-01T11:24:17.297 回答
0

此错误通常在项目是在较大版本的 Visual Studio/Asp.Net 中开发并且运行/部署的机器具有较低版本时出现。首先检查两台机器的 Visual Studio 版本。

于 2013-11-05T14:27:42.860 回答
0

如果您有多个项目,当您在 Visual Studio 中运行应用程序时,其中一些项目可能不会生成。右键单击您的解决方案,然后转到“属性”、“配置属性”并确认所有项目都已设置为编译。

于 2013-10-29T03:39:54.633 回答
0

因此,作为 WCF 服务一部分的库有一种方法,那就是问题方法。

可以删除该方法及其引用吗?运行时错误会消失吗?如果您可以将源代码发布到项目文件中会很有帮助,并且您应该考虑从头开始重新创建项目文件。

这样,如果对 4.x 有任何过时的引用,它们将被删除,请发布更多关于您的进度的信息......

于 2013-11-05T02:26:25.580 回答
0

我在使用 wcf 时遇到了同样的问题,我的项目正在运行,在添加 wcf 服务后它停止加载 svc 文件和同样的问题,对我没有任何效果,最后我删除了服务并重新启动机器,重建一切,最后我再次添加了服务。

于 2014-03-06T14:47:19.660 回答
0

我一直发现找不到总是因为它不存在。
听起来可能很明显,但有时有助于让头脑正确 => 有些东西不存在。
接下来,如果您还记得将定义与实现分离的原则,那么它意味着您的包含接口和服务的库应该移动到服务的外部 dll。
既然您已经外部化了代理代码,如果它本身是构建的,那么您只剩下实现了。作为一个降级的解决方案,务实的做法是该项目已变得“有趣”。
将特定于您的任务的新项目设为一个版本,因为它现在很可能只包含对您的库的引用和一个文件,其中一行名为 thisismyservicename.svc 以及一个地址和一个绑定,它应该很容易复制系统.servicemodel 您的 web.config 的一部分。
现在您的原始项目中什么都没有了,并且可以安全地刷新。

于 2013-11-05T08:43:59.783 回答
0

看来我不是唯一一个来过这里的人。我会留下这个,以防它帮助其他人:

http://social.msdn.microsoft.com/Forums/en-US/9f0c169f-c45e-4898-b2c4-f72c816d4b55/strange-xmlserializer-error?forum=asmxandxml

只是忽略错误......它应该如何工作!?

编辑:

我已取消删除此答案以供将来参考。我终于解决了这个问题。这不是上面的问题,而是我正在使用的解决方案特有的 IIS 问题。有一个后期构建将已编译的 WCF 二进制文件复制到一个公共位置,但这显然不包括新的依赖项。

我会奖励最接近的答案。

于 2013-10-30T11:39:12.583 回答