NamedPipeClientStream.NET中的类存在问题,因为您无法使用该类创建此实例PipeDirection.In,然后成功更改ReadMode为PipeTransmissionMode.Message.
试图这样做将提高UnauthorizedAccessException.虽然管道通常用于在进程之间进行通信,但是在单个进程中的这个简单示例显示了问题:
var pipeOut = new NamedPipeServerStream("SomeNamedPipe",
PipeDirection.Out,
1,
PipeTransmissionMode.Message);
var pipeIn = new NamedPipeClientStream(".",
"SomeNamedPipe",
PipeDirection.In);
pipeIn.Connect();
pipeIn.ReadMode = PipeTransmissionMode.Message;
Run Code Online (Sandbox Code Playgroud)
UnauthorizedAccessException尝试设置ReadMode属性时,此代码将抛出一个.
在搜索有关此问题的信息时,我在其他地方找到了对它的引用,例如:
所有这些帖子都提到这是"奇怪的","奇怪的"等,但不解释"为什么"它不起作用,并且都给出相同的解决方法,"出于一些奇怪的原因"设置管道方向以InOut使得它的工作.
确实,这确实使它工作,但它需要从根本上改变管道的两端定义到全双工,而不是单向,我认为这是一个非常差的方法,除非你是能够更改客户端和服务器,这甚至可能是不可能的.
我的问题是,为什么在入站管道上启用消息模式会导致异常,是否有更好的方法来解决此问题,而不是将管道更改为双向模式?
这个问题本质上是来自另一个用户的这个问题的后续问题,它有一些很好的答案: 是否可以编写模板来检查函数的存在?
我想完全按照这个问题描述,除了我希望能够为构造函数做到这一点.例如,鉴于以下两种类型:
class NormalType
{
public:
NormalType()
{
std::cout << "NormalType::NormalType()" << std::endl;
}
};
class SpecialType
{
public:
SpecialType()
{
std::cout << "SpecialType::SpecialType()" << std::endl;
}
SpecialType(int someArg)
{
std::cout << "SpecialType::SpecialType(int someArg)" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
这个辅助函数用于构造一个对象:
template<class T>
class ConstructHelper
{
public:
template<bool HasSpecialConstructor>
static T Construct()
{
return T();
}
template<>
static T Construct<true>()
{
return T(int(42));
}
};
Run Code Online (Sandbox Code Playgroud)
我希望能够编写如下代码:
NormalType normalType = ConstructHelper<NormalType>::Construct<has_special_constructor<NormalType>::value>();
SpecialType specialType = ConstructHelper<SpecialType>::Construct<has_special_constructor<SpecialType>::value>();
Run Code Online (Sandbox Code Playgroud)
NormalType::NormalType()调用所需结果的地方,并SpecialType::SpecialType(int someArg)调用.这里缺少的成分是关键has_special_constructor帮助器,它可以确定我们的特殊构造函数是否存在给定类型. …