小编BTo*_*TKD的帖子

WCF NamedPipe CommunicationException - "管道已结束.(109,0x6d)."

我正在编写带有"状态工具"的Windows服务.该服务托管一个名为管道端点的WCF,用于进程间通信.通过命名管道,状态工具可以定期查询服务以获取最新的"状态".

在此输入图像描述

在我的开发机器上,我有多个IP地址; 其中一个是具有192.168.1.XX地址的"本地"网络.另一个是"公司"网络,具有10.0.X.XX地址.Windows服务在单个IP地址上收集UDP多播流量.

到目前为止,Windows服务只要使用"192.168.1.XX"地址就可以正常工作.它始终正确地向客户报告状态.

一旦我切换到另一个"公司"IP地址(10.0.X.XX)并重新启动服务,我在检索状态时会得到连续的"CommunicationExceptions":

"There was an error reading from the pipe: The pipe has been ended. (109, 0x6d)."
Run Code Online (Sandbox Code Playgroud)

现在,我不认为UDP客户端的"声明的"IP地址应该与Named-Pipe接口的功能有关; 它们是完全独立的应用程序!

以下是相关的WCF配置部分:

//On the Client app:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
ChannelFactory<IMyService> proxyFactory =
    new ChannelFactory<IMyService>(
        new NetNamedPipeBinding(),
        new EndpointAddress(myNamedPipe));


//On the Windows Service:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
myService = new MyService(myCustomArgs);
serviceContractHost = new ServiceHost(myService );
serviceContractHost.AddServiceEndpoint(
    typeof(IMyService),
    new NetNamedPipeBinding(),
    myNamedPipe);

serviceContractHost.Open();
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个'权限'问题 - 我正在运行具有管理权限的客户端 - 但也许有一些特定于域的原因导致了这一点?

c# wcf windows-services named-pipes

16
推荐指数
2
解决办法
3万
查看次数

C++ 11空列表联合的初始化 - 是否保证初始化联合的全长?

在C++ 11中,我有以下联合:

union SomeData
{
    std::uint8_t Byte;
    std::uint16_t Word;
    std::uint32_t DWord;
    unsigned char String[128];
};
Run Code Online (Sandbox Code Playgroud)

如果我这样初始化联盟;

SomeData data {};
Run Code Online (Sandbox Code Playgroud)

是否保证联盟的全部内容都将"归零"?换一种方式; 是一个联合的空列表初始化程序,在功能上等同于将联合设置为零?:

memset(&data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)

特别是,我关心字符串数据.我想确保字符串的整个长度包含零.它似乎在我当前的编译器中工作,但规范的语言是否保证这始终是真的?

如果不是:有没有更好的方法将联合的全长初始化为零?

c++ unions c++11 list-initialization

10
推荐指数
2
解决办法
736
查看次数

如何传递unique_ptr <T>代替raw*output*指针参数?

我在外部库中有一个预先存在的函数,看起来像这样;

bool CreateTheThing(MyThing *& pOut);
Run Code Online (Sandbox Code Playgroud)

简而言之; 我给它一个原始指针(通过引用),该函数分配内存并将我的指针分配给新分配的对象.当函数返回时,它是我的责任,以释放内存,当我完成了.

显然,我想把这个结果存入一个unique_ptr<MyThing>,并避免使用手册delete.

可以创建一个临时的原始指针,用于API调用,并将其传递给构造函数unique_ptr;

MyThing* tempPtr;
CreateTheThing(tempPtr);
unique_ptr<MyThing> realPtr = unique_ptr<MyThing>(tempPtr);
Run Code Online (Sandbox Code Playgroud)

有比这更直接的方法吗?一个不需要临时原始指针的?理想情况下,会有一种方法unique_ptr以一种可以直接使用该CreateTheThing方法的方式公开其内部指针?

unique_ptr<T>::get()据我所知,不允许这样做.它返回的指针不是对内部使用指针的引用.

c++ unique-ptr c++11

8
推荐指数
3
解决办法
1142
查看次数

可重复的,复杂的正则表达式,带点"." 分隔符

我有一个正则表达式.它包含必需的命名捕获组和一些可选的命名捕获组.它捕获单个匹配并将这些部分解析为我需要的命名组.

除此之外,现在我需要重复一遍.

本质上,我的正则表达式表示(可能)更长的字符串中的单个原子单元.而不是完全匹配我的正则表达式,目标字符串通常包含正则表达式的重复实例,由点''分隔.字符.

例如,如果这是我的正则表达式捕获的内容: <some match>

实际的字符串可能看起来像这些:

  • <some match>
  • <some match>.<some other match>
  • <some match>.<some other match>.<yet another match>

修改原始正则表达式,考虑重复模式,忽略点的最简单方法是什么?

我不确定它是否真的需要,但这里是我正用于捕获单个段的正则表达式.同样,我想增强此功能以考虑可选的其他细分.我想让每个段在结果集中显示为另一个"匹配";

^(?<member>[A-Za-z_][A-Za-z0-9_]*)(?:\[(?<index>[0-9]+)\])?(?:\[(?<index2>[0-9]+)\])?(?:\[(?<index3>[0-9]+)\])?$
Run Code Online (Sandbox Code Playgroud)

它旨在解析类路径,最多包含三个可选的索引访问器.(即" member.sub_member[0].sub_sub_member[0][1][2]")

我怀疑答案涉及前瞻或后视,对此我并不完全熟悉.

我目前使用String.Split来分隔字符串段.但我认为如果正则表达式的增强足够简单,我跳过额外的Split步骤,并重新使用正则表达式作为验证机制.

编辑:

作为齿轮中的另一个扳手,我想不允许任何点'.' 从字符串的开头或结尾开始的字符.它们应仅作为路径段之间的分隔符存在.

c# regex

7
推荐指数
1
解决办法
2501
查看次数

当我的任务从自定义TaskScheduler启动时,'await'不会返回

背景:

我有一个"信使"课.它发送消息.但是由于限制,我们说它一次只能发送 - 最多 - 5条消息.

我有一个WPF应用程序,它根据需要对消息进行排队,并在继续之前等待处理排队的消息.由于应用程序的异步性质,可以await在任何给定时间编辑任意数量的消息.

目前的实施:

为此,我Task<Result> SendMessage(Message message)在我的消息类中实现了一个API.消息传递类的内部是一个自定义的TaskScheduler(来自MSDNLimitedConcurrencyTaskScheduler),其并发级别设置为5.这样,我希望无论排队多少消息,一次只发送5个,我的客户端应用程序将耐心等待,直到其相应的消息已被处理.

问题:

当我awaitSendMessage方法,我可以通过调试器看到消息已完成并返回结果,但我的代码永远不会执行awaited方法调用!

await在使用不同的TaskScheduler计划的任务时,是否需要进行一些特殊注意事项?

剪切代码:

从我的客户/消费功能:

public async Task Frobulate()
{
    Message myMessage = new Message(x, y, z);
    await messenger.SendMessage(myMessage);

    //Code down here never executes!
}
Run Code Online (Sandbox Code Playgroud)

从我的使者班:

private TaskScheduler _messengerTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
private TaskFactory _messengerTaskFactory = new TaskFactory(_messengerScheduler);

public Task<Result> SendMessage(Message message)
{
    //My debugger has verified that "InternalSendMessage" has completed, 
    //but the …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous task task-parallel-library

6
推荐指数
1
解决办法
367
查看次数

在"瘦"64位DLL包装器中包装32位COM shell扩展

前提:

我有一个旧的32位COM shell扩展(用C++编写).经过多年与更新的64位系统的不兼容,我们现在正在更新它以在64位Windows环境中工作.

诀窍:

32位COM DLL包含对第三方库的依赖性,对于这些库,没有可用的64位版本.因此,我们不能简单地"重新编译64位".鉴于此限制,我们决定最简单的方法是创建一个"瘦"的64位DLL; 本质上是一个空DLL,只定义所需的接口,并将所有调用重定向到底层的32位COM DLL.

我相信通过使用COM代理,可以在64位COM DLL和32位COM DLL之间进行通信.不幸的是,这似乎是一个非常具体/小众的主题,我一直无法找到很多关于如何从64位COM DLL调用32位COM API的资源.

问题:

  • 这个'瘦COM包装器'是一种合理的方法,用于启用32位COM DLL的64位功能吗?
  • 是否有任何理由这种方法不适用于Windows Shell Extensions?
  • 64位接口定义是否会使用与32位接口相同的GUID?
  • 这是过去记录的策略吗?
  • 在64位COM DLL中调用32位COM API有什么好的资源吗?

澄清:

这个问题有许多方面使它独特,使其与" 在Windows 7 64位中使用32位外壳扩展 "这一问题区分开来.

我不是在询问是否可以在64位资源管理器进程中加载​​32位shell扩展,正如引用的问题所做的那样.相反,我问是否有可能创建DLL精简64位实现,它充当64位资源管理器进程和32位实现之间的桥梁.

要清楚,这是不可能的.

在此输入图像描述

但也许这是

在此输入图像描述

c++ windows com shell-extensions 32bit-64bit

5
推荐指数
0
解决办法
722
查看次数

我们什么时候应该选择宽字符串呢?

我正在现代化一个大型的传统MFC代码库,其中包含一个名副其实的字符串类型:

  • CString的
  • 的std :: string
  • 的std :: wstring的
  • 字符*
  • wchar_t的*
  • _bstr_t

我想在内部标准化单个字符串类型,并且只有在第三方API(即COM或MFC函数)绝对需要时才转换为其他类型.我的同事和我正在辩论的问题; 我们应该标准化哪种字符串类型?

我更喜欢C++标准字符串之一:std :: string或std :: wstring.我个人倾向于std :: string,因为我们不需要宽字符 - 它是一个内部代码库,没有面向客户的UI(即不需要多语言支持)."普通"字符串允许我们使用简单,朴素的字符串文字("Hello world"vs L"Hello world"或_T("Hello world")).

编程社区是否有官方立场?当面对多种字符串类型时,通常用作标准的"内部"存储格式?

c++ string com mfc widestring

5
推荐指数
1
解决办法
593
查看次数

TFS 如何构建基于 Visual Studio 的“打开文件夹”CMake 项目

我有一个 ARM-GCC 项目,它是使用 Visual Studio 的本机“打开文件夹...”CMake 项目支持(在 VS2017 中引入)配置和构建的。我们所有需要的构建设置都存储在 CMakeSettings.json 中。

我想使用我们的 TFS 持续集成服务器构建这个项目。

我已经确认我们的构建服务器包含 Visual Studio 2017 安装程序“开箱即用”提供的所有先决条件 - CMake、Ninja 和 ARM-GCC 编译器。这些工具都安装到“标准”Visual Studio 工具位置:

  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake
  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Linux\gcc_arm
  • 等等。

当我们使用 Visual Studio 的"File" -> "Open Folder..."方法打开项目时,这些工具“开箱即用” 。然而,在 TFS 中,我们似乎无法构建解决方案。我在构建定义中尝试了几种不同的方法......

选项 1:“Visual Studio”任务

这种方法抱怨缺少 sln/proj 文件:

指定项目或解决方案文件。当前工作目录不包含项目或解决方案文件。

这里没有项目或解决方案文件,因为它是一个“打开文件夹”项目,以CMakeSettings.json文件,而不是...

选项 2:“MSBuild”任务

我还没有找到一组能够使用 MSBuild 构建 CMake 项目文件夹的命令行选项。

选项 3:“CMake”任务

将 CMake 任务添加到构建定义时,构建服务器抱怨它不满足自动生成的“cmake”能力先决条件,尽管 Visual Studio 已安装 cmake 工具。

有没有人成功完成了 Visual …

tfs arm cmake visual-studio-2017

5
推荐指数
0
解决办法
195
查看次数

当每个项目包含对其父项的引用时,从项列表中创建树

我有一个类型的对象列表Foo.每个Foo对象都包含对其父对象的引用:

public class Foo
{
    public Foo Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

(如果Parent为null,则Foo认为它是'根'节点.)正如您所看到的,这意味着一种"自下而上"的树层次结构.

我想通过将我的Foo对象包装在一个名为的新类中来颠倒这个child-> parent关联TreeItem.

public class TreeItem<T>
{
    public T Item { get; set; }
    public IEnumerable<TreeItem<T>> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如图所示,这将给我一个更自然的"自上而下"树层次结构.我相信这将允许更容易的数据绑定,例如.在WPF中TreeView.

是否有一个简洁的Linq语句,它能够获取a List<Foo>,找到每个Foo对象的子节点,并吐出相应转换后的列表TreeItem<Foo>

除了Linq查询,最简单的算法是什么?

额外奖励:您将使用哪些词语或搜索词来描述这种"树翻转"转换?

c# linq tree

4
推荐指数
1
解决办法
849
查看次数

安装 WinCE 5.0 Platform Builder SDK - 使用 Visual Studio 2012 或更高版本构建代码

我有一个基于 Windows CE 5.0 的 Platform Builder 映像。它旨在安装在 Visual Studio 2005 上。我的团队希望升级我们的构建工具以使用 Visual Studio 2012,但 Visual Studio 2012 不支持此平台映像。

要清楚;我不是在问 Visual Studio 2012(或更高版本)是否支持针对 Windows CE 5.0 的 Platform Builder SDK。 这个问题已经得到了回答(或多或少),答案显然是“不”。

相反,我想做的是安装 Platform Builder SDK,并手动修改 Visual Studio 2012 环境以允许编译我的 Windows CE 代码。远程调试和部署等功能对我的团队来说是可以接受的损失;我们有自己的在嵌入式设备上进行部署和调试的途径。我真正希望获得的只是在 VS2012 中构建 WinCE 5.0 代码的能力,该代码是为 VS2005 设计的。我正在尝试减少 Visual Studio 安装的数量,并访问较新版本的 Visual Studio 的高级智能感知能力。

有谁知道这是否可能?我该怎么做?

platform-builder windows-ce visual-studio visual-studio-2012

3
推荐指数
1
解决办法
6814
查看次数