3

我正在尝试使用 IDesign 中的 ServiceModelEx 库。当我尝试打电话时:

InProcFactory.CreateInstance();

从 WCF 服务中(基本上从 WCF 服务 A 调用 WCF 服务 B),我收到以下错误:

找不到动态程序集

失败的代码是:

  internal static Assembly[] GetWebAssemblies()
  {
     Debug.Assert(IsWebProcess());
     List<Assembly> assemblies = new List<Assembly>();

     if(Assembly.GetEntryAssembly() != null)
     {  
        throw new InvalidOperationException("Can only call in a web assembly");
     }
     foreach(ProcessModule module in Process.GetCurrentProcess().Modules)
     {
         assemblies.Add(Assembly.LoadFrom(module.FileName));
         if (module.ModuleName.StartsWith("App_Code.") && module.ModuleName.EndsWith(".dll"))
         {
             assemblies.Add(Assembly.LoadFrom(module.FileName));
         }
         if (module.ModuleName.StartsWith("App_Web_") && module.ModuleName.EndsWith(".dll"))
         {
             assemblies.Add(Assembly.LoadFrom(module.FileName));
         }
     }
     if (assemblies.Count == 0)
     {
         throw new InvalidOperationException("Could not find dynamic assembly");
     }
     return assemblies.ToArray();
  }

程序集没有以 App_Web 或 App_Code 为前缀,因为这不是网站或 Web 应用程序(它是 WCF 服务)。但是,如果我从网站、Web 应用程序或 EXE 调用该代码,则该代码确实有效。这是设计的吗?

4

2 回答 2

1

也许您期望的模块在这种情况下根本没有加载。

于 2012-11-08T14:43:03.753 回答
0

那就是通用解析器崩溃了。它试图尽最大努力发现所有可能包含数据合同的程序集,但随着不同托管环境(特别是 IIS 变体)的弹出,这有点像军备竞赛。动态代码的引入也让生活变得更加困难。

如果您使用最新的 ServiceModelEx (SME),它有解决此问题的修复程序。只需确保您在下载中使用最新的 .NET 版本(当前为 4.6.1),因为 SME 的旧 .NET 版本下载(例如 4.0 和更早版本)不会有这些修复。如果需要,您可以降级 .NET 版本(在限制范围内)。例如,我将 4.6.1 版本降为 4.5.2。

注意:仅当您通过通用解析器使用数据合同继承时才需要这样做。如果您不需要此功能并且它会导致您出现问题,您可以注释掉有问题的代码。

于 2017-06-26T06:37:37.920 回答