XSockets在GetExport上抛出InvalidOperati

本文关键字:InvalidOperati IXSocketServerContainer GetExport XSockets | 更新日期: 2023-09-27 18:08:50

我遇到了一个奇怪的问题。我有完全一样的密码。在一台机器上,它可以完美地运行。另一方面,它在GetExport上抛出InvalidOperationException

错误行是:

  _serverContainer = Composable.GetExport<IXSocketServerContainer>();

下面是异常的截图:

任何想法?

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


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

把那个不能工作(还在编译)的项目放到第一台机器上,它也不能在那台机器上工作。完全没主意了

XSockets在GetExport<IXSocketServerContainer>上抛出InvalidOperati

好吧,看来这是off the bat…

它与XSockets没有直接关系。

在VS.

中出现了一个(已知的?)困难(即bug)

项目A (.exe)包含项目B (.dll)。项目B的依赖项将被复制到它的输出目录中。项目A将无法获得项目B所需要的依赖项,并且会在运行时崩溃。


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

copy /y source target

你可能想用双引号括住你的源和目标,以避免失败,如果它们包含空格。
您希望/y覆盖目标中的文件。
为了获得正确的语法,您可能还需要玩一些:

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

相关链接:

Visual Studio Post Build事件-复制到相对目录位置

使用构建后事件将文件从一个项目复制到另一个项目…VS2010

在VS2010的Post Build事件中将bin文件复制到物理文件位置

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有#(尖锐的,或哈希字符)在它的路径…服务器也会抛出上述异常

这样做的原因是我们使用以下方法来定位程序集。

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(..)"的内容。

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