我正在编写带有"状态工具"的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++ 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)
特别是,我关心字符串数据.我想确保字符串的整个长度包含零.它似乎在我当前的编译器中工作,但规范的语言是否保证这始终是真的?
如果不是:有没有更好的方法将联合的全长初始化为零?
我在外部库中有一个预先存在的函数,看起来像这样;
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()据我所知,不允许这样做.它返回的指针不是对内部使用指针的引用.
我有一个正则表达式.它包含必需的命名捕获组和一些可选的命名捕获组.它捕获单个匹配并将这些部分解析为我需要的命名组.
除此之外,现在我需要重复一遍.
本质上,我的正则表达式表示(可能)更长的字符串中的单个原子单元.而不是完全匹配我的正则表达式,目标字符串通常包含正则表达式的重复实例,由点''分隔.字符.
例如,如果这是我的正则表达式捕获的内容: <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步骤,并重新使用正则表达式作为验证机制.
编辑:
作为齿轮中的另一个扳手,我想不允许任何点'.' 从字符串的开头或结尾开始的字符.它们应仅作为路径段之间的分隔符存在.
背景:
我有一个"信使"课.它发送消息.但是由于限制,我们说它一次只能发送 - 最多 - 5条消息.
我有一个WPF应用程序,它根据需要对消息进行排队,并在继续之前等待处理排队的消息.由于应用程序的异步性质,可以await在任何给定时间编辑任意数量的消息.
目前的实施:
为此,我Task<Result> SendMessage(Message message)在我的消息类中实现了一个API.消息传递类的内部是一个自定义的TaskScheduler(来自MSDN的LimitedConcurrencyTaskScheduler),其并发级别设置为5.这样,我希望无论排队多少消息,一次只发送5个,我的客户端应用程序将耐心等待,直到其相应的消息已被处理.
问题:
当我await的SendMessage方法,我可以通过调试器看到消息已完成并返回结果,但我的代码永远不会执行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) 前提:
我有一个旧的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的资源.
问题:
澄清:
这个问题有许多方面使它独特,使其与" 在Windows 7 64位中使用32位外壳扩展 "这一问题区分开来.
我不是在询问是否可以在64位资源管理器进程中加载32位shell扩展,正如引用的问题所做的那样.相反,我问是否有可能创建DLL的精简64位实现,它充当64位资源管理器进程和32位实现之间的桥梁.
要清楚,这是不可能的.

但也许这是?

我正在现代化一个大型的传统MFC代码库,其中包含一个名副其实的字符串类型:
我想在内部标准化单个字符串类型,并且只有在第三方API(即COM或MFC函数)绝对需要时才转换为其他类型.我的同事和我正在辩论的问题; 我们应该标准化哪种字符串类型?
我更喜欢C++标准字符串之一:std :: string或std :: wstring.我个人倾向于std :: string,因为我们不需要宽字符 - 它是一个内部代码库,没有面向客户的UI(即不需要多语言支持)."普通"字符串允许我们使用简单,朴素的字符串文字("Hello world"vs L"Hello world"或_T("Hello world")).
编程社区是否有官方立场?当面对多种字符串类型时,通常用作标准的"内部"存储格式?
我有一个 ARM-GCC 项目,它是使用 Visual Studio 的本机“打开文件夹...”CMake 项目支持(在 VS2017 中引入)配置和构建的。我们所有需要的构建设置都存储在 CMakeSettings.json 中。
我想使用我们的 TFS 持续集成服务器构建这个项目。
我已经确认我们的构建服务器包含 Visual Studio 2017 安装程序“开箱即用”提供的所有先决条件 - CMake、Ninja 和 ARM-GCC 编译器。这些工具都安装到“标准”Visual Studio 工具位置:
当我们使用 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 …
我有一个类型的对象列表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查询,最简单的算法是什么?
额外奖励:您将使用哪些词语或搜索词来描述这种"树翻转"转换?
我有一个基于 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
c# ×4
c++ ×4
c++11 ×2
com ×2
.net ×1
32bit-64bit ×1
arm ×1
asynchronous ×1
cmake ×1
linq ×1
mfc ×1
named-pipes ×1
regex ×1
string ×1
task ×1
tfs ×1
tree ×1
unions ×1
unique-ptr ×1
wcf ×1
widestring ×1
windows ×1
windows-ce ×1