小编Jef*_*ser的帖子

如何使用c#在Windows窗体中创建F1帮助

如何使用c#在Windows窗体中创建键盘快捷键(F1).WinChm

.net windows chm

12
推荐指数
1
解决办法
2万
查看次数

MemoryStream vs一个字节数组

在使用MemoryStream时,我发现自己经常将数据复制(因此复制)到一个临时的字节数组.

我认为这有点浪费资源,因为MemoryStream不会让你直接访问底层的字节数组.

在这种情况下,MemoryStream的真正优势是什么?我在某处读过它就像一个内存映射文件.数据仅在访问时从磁盘传输,消耗更少的内存.

真的吗?我不这么认为.也许是FileStream的情况?

谢谢你的澄清.

.net arrays byte memorystream

8
推荐指数
1
解决办法
6349
查看次数

在PowerShell中正确显示托盘气球工具提示

简短版本:我认为我需要帮助正确使用PowerShell中由于Windows消息而调用的事件来摆脱气球工具提示的图标.

长版:

我有一个长期运行的PowerShell命令(一个版本),我希望通过系统托盘/通知区域中的气球工具提示完成通知.

我能够创建一个Write-BalloonTip脚本(下面),它完全符合我的要求.唯一的问题是,托盘图标有时会发生,托盘图标不会消失,直到我将鼠标悬停在托盘图标上.通过重新使用相同的全局变量来表示NotifyIcon,我可以重新使用此脚本并保留它,以便只保留一个系统托盘图标(直到我将鼠标悬停在它上面).这仍然感觉像是一个黑客.我尝试添加一个事件处理程序,以便在BalloonTipClosed事件上通知它,然后在那里处理它.在事件处理程序中,我尝试了我看到的所有三种技术,以摆脱挥之不去的图标无济于事.

令人讨厌的部分是,一个简单的东西.Dispose似乎可以用于后续的脚本调用,这使我认为事件脚本块根本没有被调用.

我已经验证了在一个单独的WinForms应用程序中提示消失后BalloonTipClosed被调用.

我错过了什么基本的东西?任何帮助深表感谢.谢谢!

这是"Write-BalloonTip.ps1"的代码:

param
(
    $text,
    $title = "",
    $icon = "Info",
    $timeout=15000
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

if ($global:writeBalloonTipIcon)
{
    # This gets rid of the previous one
    $global:writeBalloonTipIcon.Dispose()
}

$global:writeBalloonTipIcon = new-object System.Windows.Forms.NotifyIcon 
$global:writeBalloonTipIcon.Icon = [System.Drawing.SystemIcons]::Information

# FIXME: This *should* cleanup the icon after it's done, but it doesn't seem to work
$global:writeBalloonTipIcon.add_BalloonTipClosed(
  {
    # this *should* work, but it's not. …
Run Code Online (Sandbox Code Playgroud)

powershell notifications system-tray

8
推荐指数
1
解决办法
6440
查看次数

是否可以严格限制前端和后端Azure IaaS VM之间的入口和出口流量?

我想使用IaaS VM在Azure上创建一个超偏执的hub-and-spoke DMZ设置.

我有一个面向前端服务器的公共互联网(即IIS网络服务器),我想严格锁定.但是,前端需要访问某些后端服务器(即数据库,域控制器等).我想确保:

  1. 只有前端服务器才能与后端服务器通信,并且只能在商定的端口上进行通信.
  2. 后端服务器无法从公共互联网接收发送流量.
  3. 后端服务器无法相互通信.
  4. 这些规则在VM操作系统层之外强制执行,以提供深度防御.

这似乎是一个合理的方案,但我似乎无法在Azure上实现它.我能做的最接近的是:

  • 创建IaaS VM前端并适当地限制其端点
  • 使用"FrontEnd"和"BackEnd"子网创建Azure虚拟网络,将每台计算机放在适当的子网上.
  • 防止RDP访问后端VM.如果我想将RDP连接到后端机器,我必须通过前端VM完成.
  • 在每台计算机上设置Windows防火墙规则以强制执行这些中心辐射式规则.

这工作正常,但并不像我想的那样被锁定.我真的希望深度防御,这样我就不必依赖每台机器上的Windows/Linux防火墙设置.例如,假设后端服务器必须运行具有管理员凭据的应用程序(假设没有替代方案).我想要一个额外的保护层,以便后端服务器上的错误(或恶意查询)不能:

  • 重新配置后端的防火墙以减少限制.
  • 除了前端机器(包括公共互联网)之外,与其他任何人交谈.

据我所知,这在使用虚拟网络的Azure上是不可能的,因为:

  • Azure虚拟网络似乎不公开ACL或任何其他高级过滤支持.
  • Azure IaaS VM仅支持单个NIC,因此前端无法在前端和后端子网上进行多宿主.

我错过了什么吗?看起来我可能能够使用多个虚拟网络一起破解某些东西并将它们作为一堆/ 30个子网一起VPN,但这看起来非常糟糕.如果我无法在Azure上解决这个问题,我认为唯一合理的选择就是尝试使用虚拟私有云(VPC)AWS上设置类似的东西.任何帮助/指导将不胜感激.

security networking dmz azure

8
推荐指数
1
解决办法
1584
查看次数

什么是最好的低技术协议,从帽子模拟绘图名称,并确保保密?

每年在感恩节,我的家人都会从帽子中抽出名字来确定他们将成为圣诞节礼物交换的"秘密圣诞老人".对我们的家庭文化来说,重要的是家庭中没有其他人知道对方是为了让它变得有趣而得到的.选择的唯一规则是你不能选择你的配偶.如果发生这种情况,你再次画画并将你的配偶的名字放回帽子里.

由于今年的物流和旅行计划,我们提前庆祝圣诞节(感恩节后仅两周).

为了有足够的时间寻找礼物,我们现在想选择名字.我们的家庭位于美国各地.有些成员可以上网,有些则不上网(例如亲爱的奶奶).

我想做的是有一个公平的协议,模拟从帽子中绘制名称,并确保一定程度的保密,而不是过于复杂.一些网站,如前drawames.com或其他类似的网站,通常需要人们输入他们的电子邮件地址.我想确保我家人的电子邮件地址不被滥用,所以我不想信任他们到另一个网站.

我能想出的最好的协议是:

  1. 编写一个随机选择人的程序,确保人们不会得到他们的配偶.
  2. 该程序将向我显示列表的一半,但不会告诉我谁有我的名字,但会告诉我我的名字和得到我妻子名字的人.
  3. 然后,我将离开房间,程序将向我的妻子显示另一半人名(其中包括谁有我的名字).
  4. 然后我和我的妻子会联系每个人并告诉他们他们有谁.

我错过了更好的协议吗?更好的是,我的意思是允许更多保密.再次,由于物流和保持简单,我不想建立一个网站.

algorithm cryptography protocols

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

如何使现有的公共API可以测试使用它的外部程序员?

我有一个C#公共API,许多第三方开发人员都使用它来编写自定义应用程序.此外,API被内部开发人员广泛使用.

这个API并没有考虑到可测试性:大多数类方法都不是虚拟的,并且事物没有被分解到接口中.另外,还有一些辅助静态方法.

出于多种原因,我无法在不对使用我的API的程序员开发的应用程序进行重大更改的情况下显着更改设计.但是,我仍然希望使用此API的内部和外部开发人员有机会编写单元测试并能够模拟API中的对象.

有几种方法可以想到,但它们似乎都不是很好:

  1. 传统方法是强制开发人员创建一个他们控制的代理类,以便与我的API通信.这在实践中不起作用,因为现在有数百个类,其中许多是有效的强类型数据传输对象,这将很难再现和维护.

  2. 强制所有使用想要对其进行单元测试的API的开发人员购买TypeMock.这似乎很苛刻,迫使人们为每个开发人员支付300美元+,并可能要求他们学习不同于他们习惯的模拟对象工具.

  3. 浏览整个项目并将所有方法设为虚拟.这将允许使用像MoqRhino Mocks这样的免费工具来模拟对象,但它可能会为从未打算从中派生的类带来安全风险.此外,这可能会导致重大变化.

  4. 我可以创建一个工具,给定一个输入程序集将输出一个具有相同名称空间,类和成员的程序集,但会使所有方法都是虚拟的,它会使方法体只返回返回类型的默认值.然后,每次我发布API更新时,我都可以发送这个虚拟测试程序集.然后,开发人员可以针对虚拟程序集编写API测试,因为它具有非常可模拟的虚拟成员.这可能有用,但为此编写一个自定义工具似乎有点乏味,我似乎无法找到一个做得好的现有工具(尤其适用于泛型).此外,它的复杂性在于它要求开发人员使用可能会过时的两个不同的程序集.

  5. 与#4类似,我可以遍历每个文件并为每个方法和正文添加类似"#ifdef UNITTEST"的内容,以完成与工具相同的操作.这不需要外部工具,但它会用很多丑陋的"#ifdef"来污染代码库.

还有其他我认为不合适的东西吗?像#4中提到的工具是否已经存在?

同样,复杂的因素是这是一个相当大的API(数百个类和~10个文件)并且使用它的现有应用程序使得很难进行剧烈的设计更改.

目前已经 几个 问题上堆栈溢出认为是通用性有关改造现有的应用程序,使之可测试的,但似乎没有解决我的(特别是在与众多第三方开发者广泛使用的API的情况下)的关注.我也知道" 有效地使用遗留代码 "并认为它有很好的建议,但我正在寻找一种特定的.net方法,考虑到上面提到的限制.

更新:到目前为止我很欣赏答案.一说帕特里克Hägne长大的是"为什么不能提取接口?" 这确实起到了一定作用,但是存在一些问题,例如现有的设计有很多我们采用暴露具体类的情况.例如:

public class UserRepository 
{ 
    public UserData GetData(string userName) 
    {
        ...
    } 
}
Run Code Online (Sandbox Code Playgroud)

如果给予"IUserData",那么期望具体类(例如"UserData")的现有客户将会中断.

此外,正如评论中所提到的,我们会在某个类中接受一个类,然后为了方便而公开它.如果我们接受一个接口然后不得不将它作为具体类公开,这可能会导致问题.

重大改写或重新设计的最大挑战是对当前的API进行了大量投资(数千小时的开发,可能还有第三方培训).因此,虽然我同意一个更好的SOLID设计重写或抽象层(最终可能成为新的API),专注于接口分离原则等项目,从可测试性的角度来看会是一个加分,但它可能是一个很大的事业,可能目前不能成本合理.

我们确实测试了当前的API,但它是更复杂的集成测试而不是单元测试.

另外,正如Chad Myers所提到的,这个问题解决了.NET框架本身在某些领域面临的类似问题.

我意识到我可能正在寻找一个不存在的"银弹",但所有的帮助都值得赞赏.重要的是保护许多第三方开发人员的巨大时间投资以及创建当前API的巨大现有开发.

所有答案,尤其是那些考虑问题的业务方面的答案,都将得到认真审查.谢谢!

.net c# unit-testing

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

正确通知所有侦听器系统范围内的手动重置事件,然后立即重置它

我有一个系统范围的手动重置事件,我通过执行以下操作创建:

EventWaitHandle notifyEvent = new EventWaitHandle(false, EventResetMode.ManualReset, notifyEventName, out createdEvent);
Run Code Online (Sandbox Code Playgroud)

几个进程创建此事件(例如,它们在它们之间共享).它用于通知何时更新内容.

我希望能够设置此事件,以便在其上发出等待的所有进程,然后立即重置它,以便阻止事件的后续Waits.

如果我做了

notifyEvent.Set();
notifyEvent.Reset();
Run Code Online (Sandbox Code Playgroud)

它有时会通知所有监听过程.

如果我做了

notifyEvent.Set();
Thread.Sleep(0);
notifyEvent.Reset();
Run Code Online (Sandbox Code Playgroud)

更多进程得到通知(我认为这会发生,因为调度程序有机会运行).

如果我这样做

notifyEvent.Set();
Thread.Sleep(100);
notifyEvent.Reset();
Run Code Online (Sandbox Code Playgroud)

然后一切似乎都很好,所有过程(例如~8)都会得到一致的通知.我不喜欢在睡眠呼叫中使用"幻数".

是否有更好的方法通知所有侦听器在其他进程中发生事件已发生的事件,以便在通知时收听事件信号的每个人都会立即重置事件,以便其他任何人去听该事件会阻止吗?

更新:信号量似乎不适合这里,因为事件的听众数量会随着时间的推移而变化.事先并不知道甚至需要通知时会有多少听众.

c# windows events multithreading

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

误解MixColumns步骤

我在理解这里描述的MixColumns步骤时遇到了问题.

我知道扩散,这一切都有意义,它指出每个列被视为多项式并在GF(2 ^ 8)上乘以模数.

但是......在GF(2 ^ 8)中乘法.虽然域仍然是相同的,但由于mod ......它是不可逆的,并且它必须是可逆的,因为这是它的全部要点.

就第一位而言,我的方法是将A,B,C和D作为列的4个字节,A1,A2,...,A8作为位,E,F,G和H作为输出字节.我准备好了

E = A1,B2,C3,D4,A5,B6,C7,D8
F = D1,A2,B3,C4,D5,A6,B7,C8
G = C1,D2,A3,B4,C5,D6,A7,B8
H = B1,C2,D3,A4,B5,C6,D7,A8
Run Code Online (Sandbox Code Playgroud)

因此它是可逆的,一对一,线性和分配

它后来表明它可以被视为矩阵乘法,但由于矩阵的元素必须是字节并输出为字节,因此矩阵的每个元素必须是模256,因此不可逆和非线性.

我明白这个错了吗?我努力学习数学,并试图了解需要做什么,以便我可以将其转换为逻辑.

math logic aes

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