2

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

违规行是:

  _serverContainer = Composable.GetExport<IXSocketServerContainer>();

这是异常的屏幕截图:screenshot

有任何想法吗?

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


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

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

4

2 回答 2

3

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

它与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 生成后事件 - 复制到相对目录位置

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

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

VS BUG: 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 ......服务器也将抛出上述异常。

于 2014-06-17T02:37:31.927 回答
0

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

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

所以,因为我们使用:

new Uri(...)

“#”将被删除,路径将找不到程序集,然后您将得到“序列不包含匹配元素...”异常。

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

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

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

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

于 2014-06-23T06:20:59.243 回答