小编Mik*_*oss的帖子

WPF/XAML:Typography.Capitals似乎没有任何效果

所有这些文本看起来都一样,但我试图让它们看起来不同.我想要小帽子文字.我在这里错过了什么让小帽子排版效果起作用?

要重现这一点,请打开Visual Studio 2008,Do File | New Project,创建一个新的Windows | WPF应用程序,将下面的标记粘贴到Window1.xaml中,然后运行它.

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <FlowDocumentReader>
        <FlowDocument>
            <Paragraph>
                <Run>Some text</Run> <LineBreak />
                <Run Typography.Capitals="SmallCaps">Some text</Run> <LineBreak />
                <Run Typography.Capitals="AllSmallCaps">Some text</Run> <LineBreak />
                <Run Typography.Capitals="PetiteCaps">Some text</Run> <LineBreak />
                <Run Typography.Capitals="AllPetiteCaps">Some text</Run> <LineBreak />
            </Paragraph>
        </FlowDocument>
        </FlowDocumentReader>
    </Grid>
</Window>   
Run Code Online (Sandbox Code Playgroud)

根据第一个答案,似乎如果你指定一个特定的字体,你可以到达某个地方.将FlowDocument开始标记更改为:

   <FlowDocument FontFamily="Palatino Linotype">
Run Code Online (Sandbox Code Playgroud)

..你得到SmallCaps和AllSmallCaps,但不是PetiteCaps或AllPetiteCaps.所以它取决于字体.但这引起了其他问题:

  • 为什么默认字体(看起来很像Times New Roman)不支持这些?
  • 其他广泛使用的字体(例如本地Courier New等价物)是否支持这些?
  • 是否有哪些字体支持的列表?
  • 有多少百分比的字体会支持这种情况 - 大多数,有些还是少数?
  • 你能否在代码中确定字体支持的内容 - 如果是这种情况,我可以伪造AllSmallCaps - 例如通过将文本转换为所有大写并缩放80%.但不是SmallCaps.

wpf xaml flowdocument smallcaps

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

C#中是否存在众所周知的异步网络代码模式?

我最近在C#中编写了一个快速而肮脏的概念验证代理服务器,作为使Java Web应用程序与驻留在另一台服务器上的传统VB6应用程序进行通信的努力的一部分.这简直太荒谬了:

代理服务器和客户端都使用相同的消息格式; 在代码中我使用一个ProxyMessage类来表示来自客户端的请求和服务器生成的响应:

public class ProxyMessage
{
   int Length; // message length (not including the length bytes themselves)
   string Body; // an XML string containing a request/response

   // writes this message instance in the proper network format to stream 
   // (helper for response messages)
   WriteToStream(Stream stream) { ... }
}
Run Code Online (Sandbox Code Playgroud)

消息尽可能简单:正文的长度+消息正文.

我有一个单独的ProxyClient类,表示与客户端的连接.它处理代理和单个客户端之间的所有交互.

我想知道的是它们是简化与异步套接字编程相关的样板代码的设计模式还是最佳实践?例如,您需要注意管理读取缓冲区,以免意外丢失字节,并且需要跟踪处理当前消息的距离.在我当前的代码中,我在我的回调函数中完成所有这些工作TcpClient.BeginRead,并在一些实例变量的帮助下管理缓冲区的状态和当前的消息处理状态.

我传递给我的回调函数的代码BeginRead如下,以及上下文的相关实例变量.代码似乎工作正常"原样",但我想知道它是否可以重构一点以使其更清晰(或者它可能已经是?).

private enum BufferStates 
{ 
    GetMessageLength, 
    GetMessageBody 
}
// The read buffer. Initially 4 bytes because we are …
Run Code Online (Sandbox Code Playgroud)

c# sockets c#-2.0

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

有没有像SOAP代理服务器这样的东西,还是我必须自己滚动?

免责声明:我已经尝试使用谷歌搜索可以做我想要的东西,但没有运气.我希望这里有人可以伸出援助之手.

背景

我有一个.NET类库,可以使用WSE 2.0库访问安全的Web服务.Web服务为中央数据库提供了一个前端(它实际上是跨越多个客户的数据共享网络的一部分),类库提供了一个围绕Web服务调用的简单包装,使其可以从传统的VB6应用程序访问.遗留应用程序使用类库来检索和发布Web服务的信息.目前,应用程序和类库DLL都安装在多个工作站的客户端.

问题

问题是我们正在访问的Web服务使用HTTPS,并且需要向Web服务提供有效的X509客户端证书才能访问它.由于我们的所有组件都存在于客户端计算机上,因此导致了部署问题.例如,我们必须在每台客户端计算机上下载并安装每用户证书,每个用户可能需要通过我们的应用程序访问Web服务.更重要的是,必须通过VPN(特别是OpenVPN)访问Web服务器本身,这意味着必须在每台客户端计算机上安装和配置VPN客户端.这是一个主要的痛苦(我们的一些客户有几十个工作站).

建议的解决方案

建议的解决方案是将所有这些逻辑移动到客户站点上的中央服务器.在这种情况下,我们的遗留应用程序将与本地服务器通信,然后本地服务器将关闭并转发请求到真正的Web服务.此外,作为简化和集中部署工作的一部分,所有X509证书都将安装在服务器上,而不是安装在每台客户端计算机上.

到目前为止,我们已经提出了三个选择:

  • 找到一个现成的SOAP代理服务器,它可以接收传入的基于HTTP的SOAP请求,修改HostSOAP消息的头部和路由相关部分(因此它们指向真实的Web服务器),打开与真实Web的SSL连接服务器,向服务器提供正确的客户端证书(基于用户名到证书的映射),转发修改后的请求,读取响应,将其转换回明文,然后将其发送回客户端.
  • 手工编写代理服务器,完成我刚才提到的所有内容.
  • 想想完全不同的,希望更好的方法来解决这个问题.

合理

尝试查找和/或编写SOAP代理服务器的基本原理是我们现有的.NET包装器库根本不需要修改.我们只需将它指向代理服务器而不是真正的Web服务端点,使用普通的HTTP连接而不是HTTPS.代理服务器将处理请求,修改它以便真正的Web服务接受它(例如更改SOAPAction标头以使其正确),处理SSL /证书握手,并将原始响应数据发送回客户.

然而,这对我来说听起来像是一个可怕的黑客.那么,我的选择在这里呢?

  • 我是否咬紧牙关并编写自己的HTTP/SSL/SOAP/X509识别代理服务器来完成所有这些工作?
  • 或者......是否有一个现成的解决方案,具有足够的可扩展API,我可以很容易地做到我想要的
  • 或者......我应该采取完全不同的方法吗?

我们试图解决的关键问题是(a)集中存储证书的位置以简化证书的安装和管理,以及(b)进行设置,以便与Web服务器的VPN连接仅发生在一台机器上,而不是需要每个客户都安装了VPN客户端软件.

请注意,我们不控制托管Web服务的Web服务器.

编辑:为了澄清,我已经在C#中实现了一个(相当糟糕的)代理服务器,它确实符合要求,但是对于我解决这个问题的整个方法,我觉得从根本上说是错误的.所以,最终,我正在寻找保证我在正确的轨道上,或者有用的建议告诉我,我正在以完全错误的方式解决这个问题,以及任何提示做得更好的方法(如果有的话,我怀疑有).

c# vpn ssl web-services c#-2.0

6
推荐指数
2
解决办法
3037
查看次数

如何从LDAP目录中检索自特定日期以来添加的那些用户和组的列表?

我的应用程序每天进行一次LDAP查询,并获取给定容器中的所有用户和组.一旦获取,我的应用程序将遍历组的用户列表,仅将新的用户添加到我的应用程序的数据库(它只添加用户名).

如果有50,000个用户,我的应用程序服务器每天忙于执行此操作45分钟.

有没有办法在我的LDAP查询中指定我需要"delta",以便我只检索自上次LDAP查询以来添加/修改/删除的用户?

ldap ldap-query

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

Active Directory是否真的符合LDAP标准?

我正在开发一个产品插件(一个RMS),允许客户将存储在其LDAP目录中的员工信息导入到我们应用程序中的相应Person记录中.

我们的RMS允许个人记录具有多个名称和地址(它是一个公共安全系统:此功能用于支持具有AKA和多个已知地址的人员).由于软件的性质,我们认为如果LDAP服务器支持,从LDAP中提取多个名称和地址非常有用.

我的印象是Active Directory会支持这一点,但它根本不显示.例如,看看RFC 2256,第5.41和5.42节,很明显这givenName是一个多值字段(即语法没有指定SINGLE-VALUE,RFC 2252声明"多值"是默认值).这同样适用于cn,sn,streetAddress,和大多数其他任何"标准"的属性,我懒得抬一下.

微软自己的文档似乎表明它们符合RFC 2256:

目前,Windows 2000 Active Directory通过支持以下RF​​C达到LDAP合规性.

[RFC 2256随后列在各种"支持的"RFC中,标题为"核心LDAP要求 - RFC 3377"]

RFC 3377声明RFC 2256确实是8个RFC集合的一部分,它们共同构成了LDAPv3的完整技术规范.

我很困惑:不会遵循标准属性的实际建议语法,例如givenNameet al.构成"违规"?

此外,是否有人在连接和查询Active Directory与其他目录服务器(OpenLDAP,eDirectory等)之间有明确的差异列表?这是一个VB6应用程序,所以我一直在使用ADSDSOObjectADODB提供程序.起初,我以为我可以只写相同的代码对任何目录服务器,并将它作为我用的是标准的属性,只要工作,但很明显,如果相同的属性定义为他人在一些实现单值和多值,我我将不得不编写代码来处理这种情况.

我开始怀疑这是否是为什么这么多具有​​某种"LDAP集成"的应用程序通常具有完全独立的"Active Directory"设置页面,然后是"每个其他LDAP服务器"的设置的原因之一t Active Directory"......

ldap active-directory

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

Stream.Write是否是线程安全的?

我正在为传统的RPC实现开发一个客户端/服务器库,并且遇到了在等待接收到RPC请求消息的响应消息时客户端有时会挂起的问题.事实证明,真正的问题出在我的消息框架代码中(我从底层读取数据时没有正确处理消息边界NetworkStream),但它也让我怀疑我用来通过网络发送数据的代码,特别是RPC服务器作为客户端RPC请求的结果向客户端发送大量数据的情况.

我的发送代码使用a BinaryWriter向底层写一个完整的"消息" NetworkStream.RPC协议还实现了心跳算法,其中RPC服务器每15秒发送一次PING消息.ping是由一个单独的线程发出的,因此,至少在理论上,当服务器处于将大响应流回客户端时,可以发送ping.

假设我有一个Send如下方法,其中streamNetworkStream:

public void Send(Message message)
{
   //Write the message to a temporary stream so we can send it all-at-once
   MemoryStream tempStream = new MemoryStream();
   message.WriteToStream(tempStream);

   //Write the serialized message to the stream.
   //The BinaryWriter is a little redundant in this 
   //simplified example, but here because
   //the production code uses it.
   byte[] data = tempStream.ToArray();
   BinaryWriter bw = new BinaryWriter(stream);
   bw.Write(data, 0, data.Length);
   bw.Flush();
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是呼叫bw.Write …

c# networking multithreading c#-2.0

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

使用带有Null Recordset字段的Str()时"无效使用Null",但Str(Null)工作正常

我正在敲打这个墙上的头.我正在查看一些用VB6编写的旧数据库报告代码,并且遇到了这一行(代码将数据从"源"数据库移动到报告数据库中):

rsTarget!VehYear = Trim(Str(rsSource!VehYear))
Run Code Online (Sandbox Code Playgroud)

rsSource!VehYearNull,上面的行产生一个"无效使用Null"运行时错误.如果我在上面的行中断并在"立即"窗格中键入以下内容:

?rsSource!VehYear
Run Code Online (Sandbox Code Playgroud)

它输出Null.很好,这很有道理.接下来,我尝试重现错误:

?Str(rsSource!VehYear)
Run Code Online (Sandbox Code Playgroud)

我得到"无效使用Null"错误.

但是,如果我在立即窗口中键入以下内容:

?Str(Null)
Run Code Online (Sandbox Code Playgroud)

我没有收到错误.它只是输出Null.

如果我重复相同的实验Trim()而不是Str(),一切正常.?Trim(rsSource!VehYear)和返回Null一样?Trim(Null).没有运行时错误.

所以,我的问题是,如何才能Str(rsSource!VehYear)有可能抛出一个"无效使用的Null"错误时Str(Null)不,当我知道rsSource!VehYear是等于Null


更新:如果我在立即窗口中键入以下内容,它按预期工作(没有错误发生):

?Str(rsSource!VehYear.Value)
Run Code Online (Sandbox Code Playgroud)

这输出Null.现在,我知道这rsSource!VehYear实际上是一个ADODB.Field实例,但Value它是默认属性,因此Str应该在Value属性上运行(即Null).甚至错误消息("无效使用空")表明Str正在接收一个Null参数,但它如何Null在一种情况下区别对待而不是另一种情况?

我唯一的猜测是内部执行的Str()是不知何故未能获得默认属性,"无效的使用Null"错误发生的原因不同(除了参数以外的其他原因造成的"无效使用空的",也许当它试图从Field对象中检索默认属性).

有没有人对这里发生的事情有更详细的技术解释?

简而言之:

?Str(rsSource!VehYear)
Run Code Online (Sandbox Code Playgroud)

当抛出一个"无效使用的Null"错误rsSource!VehYearNull,但

?Str(rsSource!VehYear.Value) …
Run Code Online (Sandbox Code Playgroud)

vb6 adodb type-conversion

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

有没有理由为什么DLL重定向除了清单的存在之外不起作用?

我们有一个遗留的VB6应用程序,它使用Crystal Reports XI生成打印报告.我们通过经验发现,如果Crystal Reports打印引擎选择了错误版本的usp10.dll(Windows Uniscribe库),它就会崩溃.

一位客户在其Windows 7计算机上一直存在打印问题(运行Windows 7 Enterprise,32位).但是,我们还有一些其他客户运行各种版本的Windows 7,没有任何问题.

在其中一台出现打印问题的计算机上,我注意到usp10.dll该文件夹中存在旧版本(与Crystal Reports XI不兼容)C:\Program Files\Common Files\Microsoft Shared\Office10\.我不确定是什么应用程序安装了这些文件,因为客户没有安装Office 2002(所以我假设另一个应用程序安装了它们).但是,我暂时重命名了该文件,我们的应用程序能够正确打印,因此我们的应用程序似乎最初正在加载该文件的版本,这导致了崩溃.

崩溃仅在用户尝试打印报告时发生.我们的应用程序直接依赖于craxdrt.dll(Crystal Reports ActiveX Designer运行时库)和crviewer.dll(Crystal ActiveX报表查看器库),无论我们是通过craxdrt.dll还是通过Report Viewer控件直接打印,都会发生崩溃.

过去,我们通过将已知良好版本的usp10.dll复制到我们的应用程序目录并创建.local文件来启用DLL重定向来解决此问题.在客户站点,我尝试了这个,并尝试了为我们的EXE 创建.local文件夹并将usp10.dll放在那里的替代方法,但这两种方法都没有在我连接的机器上运行.

我注意到usp10.dll是Windows中的一个"已知"DLL(它有一个条目HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\KnownDLLs),但我在另一台Windows 7机器上运行我的应用程序(运行专业版,32位),这里也列出了DLL注册表中的已知DLL,通过使用Dependency Walker,我可以看到重定向正在该计算机上运行.这有点令人困惑,因为Microsoft 文档声明已知的DLL无法重定向.此外,正如我在问题标题中暗示的那样,我们的主要EXE不使用清单文件(Microsoft文档声明存在清单,嵌入式或独立式,禁用DLL重定向).

所以,我的问题是,有没有其他原因可以解决为什么DLL重定向可以在某些机器而不是其他机器上运行,这是否与Windows 7和Windows XP之间的差异有关?我曾考虑删除KnownDLLs注册表项中的所有内容,但由于重定向工作在此处具有相同设置的计算机上KnownDLLs,我不确定是否会实际解决问题,我不想删除该密钥我不需要.我还没有机会再次连接到客户的机器来运行Dependency Walker,但我不确定我是否能够解释它的日志(即使在它工作的机器上,我看到了很多LoadLibrary调用usp10.dll 指向重定向文件夹以外的文件夹,但有些调用显然已重定向,所以我不确定这意味着什么).


编辑:我应该还提到,每一次我们也已检查计算机具有的另一个副本usp10.dllSystem32的文件夹.看着克里斯的回答 …

windows dll windows-7

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

适用于业务线应用的WPF应用示例?

我正在学习WPF,并希望查看一些优秀的成熟WPF应用程序的源代码,这些应用程序用于商业应用程序,使用数据绑定控件(如网格)进行数据绑定以及充分利用WPF设计和模式.

对展示WPF图形功能的WPF应用程序不感兴趣.是的,我是你的典型无聊的商业应用程序.也比codeproject.com更进一步.如果您对CodePlex有所了解,那么指针会很有用.

有什么建议?

wpf design-patterns

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

如何避免在自动构建的 .NET 项目中对第三方库进行 Authenticode 签名?

我们最近购买了代码签名证书,并且我已将代码签名步骤合并到我们的自动化构建中。

我们的构建脚本必须构建 VB6 和 .NET 项目,因此我们目前有一个可以构建所有内容的批处理文件。对于 .NET 项目,我们的构建脚本调用 MSBUILD,传入要构建的解决方案文件。这些解决方案中的项目具有一些第三方依赖项,并且这些文件都在References中打开了Copy Local选项,因为运行应用程序需要它们。此外,某些项目使用 COM Interop,因此它们具有自动生成的 Interop 程序集(例如Interop.MSXML2.dll),这些程序集也会在生成期间复制到输出文件夹。

我试图找出一种简单的方法来对构建过程中编译的文件(即我们的程序集)进行代码签名,并忽略第三方库和互操作程序集,而无需分别在每个程序集上调用signtool.exe

目前,我通过在构建脚本中执行以下操作来解决此问题:

  • 确保构建清除所有以前构建的文件
  • 使用 MSBUILD 编译 .NET 解决方案,指定构建的输出文件夹
  • 使用signtool.exe对输出文件夹中的所有二进制文件(EXE、DLL、OCX)进行递归签名。这对所有内容进行签名,包括第三方库和自动生成的互操作程序集
  • 我的第三方依赖项位于单独的lib文件夹中,因此我将所有文件从lib回复制到构建输出文件夹中,覆盖构建复制到那里的副本。这样这些文件就不再被签名,但我们的程序集仍然是

我的问题是,有更好的方法吗?我能想到的唯一的其他选择是在每个需要签名的程序集上单独调用signtool.exe,但这可能会很痛苦,因为项目的数量和其中发生的更改量(程序集被重命名、移动、获取)随着项目的发展而删除)。另外,我不想猜测特定程序集是否已签名,因此循环遍历文件并批量签名对我来说最有意义。

然而,与此同时,任意签署我们没有使用代码签名证书创建的文件似乎并不正确(在道德上、法律上或其他方面)。

或者也许我完全以错误的方式处理这个问题?

.net msbuild code-signing authenticode

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