我遇到了一个奇怪的问题。我有完全相同的代码。在一台机器上,它完美无缺。另一方面,它在 GetExport< IXSocketServerContainer>
上抛出 InvalidOperationException违规行是:
_serverContainer = Composable.GetExport<IXSocketServerContainer>();
以下是该例外的屏幕截图:screenshot。
有什么想法吗?
我能想到的唯一区别是一台机器是Win 8,另一台机器是Win 7.
进一步的细节:采取有效的解决方案(win 8),按原样复制到其他机器(win 7),清理所有软件包,重新安装所有nuget依赖项,遍历所有项目添加或重新导入依赖项,现在仍在工作(在win 7机器上),虽然该项目将构建没有错误。
将非工作(但正在编译)项目带回第一台机器,它也无法在该机器上运行。完全没有想法。
答案 0 :(得分:3)
好的,似乎这是不合时宜的......
它与 XSockets 没有任何关系。
VS中的(已知?)难度(读取:bug)会发生什么。
项目A( .exe )包括项目B( .dll )。 项目B具有将被复制到其输出目录的依赖项。 项目A不会获得项目B需要的依赖项,并且会在运行时刻录并崩溃。
<强>解决方案:强>
为项目(项目属性 - &gt;构建事件)创建一个类似于
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
<强>附录强>:
除了上述内容之外,如果您从其路径中具有#
(尖锐或散列字符)的文件夹中运行XSockets ...服务器也将抛出上述异常
答案 1 :(得分: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加载到执行程序集/ exe的bin文件夹中 在4.0中,我们将使用上述方法并跳过“新的Uri(..)”。
如果您有任何问题,请告诉我。