【问题标题】:XSockets throwing InvalidOperationException on GetExport<IXSocketServerContainer>XSockets 在 GetExport<IXSocketServerContainer> 上抛出 InvalidOperationException
【发布时间】:2014-06-16 08:34:37
【问题描述】:

我遇到了一个奇怪的问题。我有完全相同的代码。在一台机器上,它可以完美运行。另一方面,它会在 GetExport

上引发 InvalidOperationException

违规行是:

  _serverContainer = Composable.GetExport<IXSocketServerContainer>();

这里也是异常的屏幕截图:screenshot

有什么想法吗?

我能想到的唯一区别是一台机器是Win 8,另一台机器是Win 7。


更多细节:采用有效的解决方案(win 8),按原样复制到其他机器(win 7),清理所有包,重新安装所有 nuget 依赖项,检查所有项目添加或重新导入依赖项,现在仍然可以工作(在 win 7 机器上),尽管该项目将毫无错误地构建。

将那个不工作(但正在编译)的项目带回第一台机器上,它也不能在该机器上工作。完全没有想法。

【问题讨论】:

    标签: c# xsockets.net


    【解决方案1】:

    好的,看来这已经结束了......

    它与XSockets没有直接关系。

    发生了什么是 VS 中的(已知?)困难(阅读:错误)。

    项目 A (.exe) 包括项目 B (.dll)。 项目 B 具有将被复制到其输出目录的依赖项。 项目 A 不会得到项目 B 需要的依赖,会在运行时烧毁和崩溃。


    解决方案:
    为项目创建一个 Post build 事件(项目属性 -> 构建事件),看起来像

    copy /y source target
    

    您可能希望在源和目标周围加上双引号,以避免在它们包含空格时失败。
    您希望 /y 覆盖目标中的文件。
    您可能还需要尝试一下才能获得正确的语法:

    copy /y "$(ProjectDir)..\project_b\$(OutDir)some_mask.dll" "$(ProjectDir)$(OutDir)"
    

    相关链接:

    Visual Studio Post Build Event - Copy to Relative Directory Location

    Copy file(s) from one project to another using post build event...VS2010

    Copy bin files on to Physical file location on Post Build event in VS2010

    VS 错误: https://connect.microsoft.com/VisualStudio/feedback/details/694561/copy-local-private-true-private-on-a-project-reference-needs-to-also-copy-what-the-target-project-marks-as-copy-local


    附录

    似乎除了上述情况之外,如果您从路径中包含#(锐利或哈希字符)的文件夹运行 XSockets ......服务器也会抛出上述异常。

    【讨论】:

    • 您好,我想了解有关此错误的更多信息。试图重现它,但它在我的机器上运行良好。你的设置是什么?
    • 嗨,Uffe,我已经在 XSockets 开发人员上打开了一个关于“#”问题的线程。否则,它会发生在 Win 8 x64 机器和 Win 7 x64 上。
    • 很高兴它帮助了其他人。我记得我对那个问题非常沮丧:)
    【解决方案2】:

    之所以这样,是因为我们使用下面的方法来定位程序集。

    public static string GetAssemblyDirectory()
    {
        return HostingEnvironment.IsHosted
                            ? HttpRuntime.BinDirectory
                            : Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
    }
    

    所以,既然我们使用:

    new Uri(...)
    

    “#”将被删除,路径将找不到程序集,然后您将得到“Sequence contains no matching elements...”异常。

    但是,如果您在使用插件框架之前手动添加路径,它应该可以工作......类似的东西。

    Composable.AddLocation(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
    

    您当然可以添加任何位置,此“示例”将加载正在执行的程序集/exe 的 bin 文件夹中的所有程序集/exe 在 4.0 中,我们将使用上述方式并跳过“new Uri(..)”的内容。

    如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多