看看像MT一样的第一眼看到的东西,但我试图详细了解COM +使用的STA模型.
实际上,我有一个用VB6编写的遗留COM +组件,它调用用C++编写的本机(即非COM)Win32 DLL.
有一些间歇性(并且不可能在测试中重现)问题,我添加了一些调试代码来找出发生了什么,并发现当问题发生时,我在文件中交错了日志消息 - 所以它暗示了DLL被两个线程同时调用.
现在,日志记录转到基于_getpid()和GetCurrentThreadId()的每线程文件,所以看起来当调用C++ DLL中的代码时,它会在同一个线程上同时被调用两次.我对STA的理解表明,可能就是这种情况,因为COM将对象的各个实例编组到一个线程上,并随意恢复执行.
不幸的是,我不确定从哪里开始.我正在读我应该在DllMain()中调用CoInitialiseEx()告诉COM这是一个STA DLL,但其他地方说这只对COM DLL有效,并且在本机DLL中不会有任何影响.唯一的另一个选择是将DLL的一部分包装为关键部分以序列化访问(获取下巴上的任何性能命中).
我可以尝试重做DLL,但是没有共享状态或全局变量 - 一切都在局部变量中所以理论上每个调用应该得到自己的堆栈,但我想知道STA模型是否基本上对此有一些奇怪的影响并在与另一个调用相同的入口点重新进入已加载的DLL.不幸的是,我不知道如何证明或测试这个理论.
问题基本上是:
我被抛出一点点,我不确定答案是什么.
基本上 - 是否存在在三态数据类型中使用什么值的约定?做一些谷歌搜索,它看起来不像:我见过:
..在其他人中.如果有的话,我宁愿使用一个众所周知的约定.否则我会提出一个:-)很可能没有正确答案,但只是想我会深入挖掘一下......
编辑
发现这个以及微软似乎在最近的代码中使用的那个:-1 = true,0 = false,2 =未知.我假设有2 ==未知意味着当仅仅查看调试器/转储/内存中的原始值时,它消除了解释+ 1/-1的歧义.奇怪的是,这个选项仅仅因为这个原因而上诉(消除了忘记1的变化意味着'真''.
我尝试设置Xcode时遇到问题.如图所示

这是我的install.log文件中的内容:
Apr 1 01:29:04 Bashars-MacBook-Pro Installer[420]: Create temporary directory "/var/folders/_4/pnfcjvx94hbgzfgsyy387b9w0000gn/T//Install.420mLpMwf"
Apr 1 01:29:04 Bashars-MacBook-Pro Installer[420]: IFPKInstallElement (29 packages)
Apr 1 01:29:04 Bashars-MacBook-Pro Installer[420]: Using authorization level of root for IFPKInstallElement
Apr 1 01:29:04 Bashars-MacBook-Pro Installer[420]: Failed install preflight: Error Domain=PKInstallErrorDomain Code=102 "The package “DeveloperTools.pkg” is untrusted." UserInfo=0x7fb8526d33d0 {NSLocalizedDescription=The package “DeveloperTools.pkg” is untrusted., NSURL=../Packages/DeveloperTools.pkg -- file://localhost/Users/bashar/Desktop/Programs/Xcode%204.2.1%20iOS%205/Install%20Xcode.app/Contents/Resources/Xcode.mpkg/, PKInstallPackageIdentifier=com.apple.pkg.DeveloperToolsLeo, NSUnderlyingError=0x7fb8526b61e0 "The operation couldn’t be completed. CSSMERR_TP_CERT_EXPIRED"}
Apr 1 01:29:04 Bashars-MacBook-Pro Installer[420]: Install failed: The Installer encountered an error that caused the installation … 标题对象
[Serializable]
[DataContract(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] // This object serialize specific namespace
public class Security
{
[DataMember] // This object serialize without namespace
public UsernameToken UsernameToken;
}
public class UsernameToken : IXmlSerializable
{
public string Username { get; set; }
public string Password { get; set; }
public XmlSchema GetSchema() { return null; }
public void ReadXml(System.Xml.XmlReader reader)
{
reader.MoveToContent();
Username = reader.ReadElementString("Username");
reader.ReadStartElement();
Password = reader.ReadElementString("Password");
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("Username", Username);
writer.WriteElementString("Password", Password);
}
}
Run Code Online (Sandbox Code Playgroud)
设置端点标头 …
我几乎完成了实现打印功能,但我无法完成最后一道障碍.
我的问题是,我正在打印一些报告,包括一个标题(包含报告所涉人员的信息),一个页脚(带有页码)和中间的内容,这是一个FlowDocument.由于流文档可能相当长,因此很可能它们将跨越多个页面.
我的方法是创建一个派生自DocumentPaginator的自定义FlowDocumentPaginator.
在那里我定义我的标题和我的页脚.
但是,当我打印我的页面时,flowdocument和我的页眉和页脚在彼此的顶部.
所以我的问题很简单 - 如何定义页面上的flowdocument部分将放置在何处和何处?
这是我的自定义Paginator的代码:
public class HeaderedFlowDocumentPaginator : DocumentPaginator
{
private DocumentPaginator flowDocumentpaginator;
public HeaderedFlowDocumentPaginator(FlowDocument document)
{
flowDocumentpaginator = ((IDocumentPaginatorSource) document).DocumentPaginator;
}
public override bool IsPageCountValid
{
get { return flowDocumentpaginator.IsPageCountValid; }
}
public override int PageCount
{
get { return flowDocumentpaginator.PageCount; }
}
public override Size PageSize
{
get { return flowDocumentpaginator.PageSize; }
set { flowDocumentpaginator.PageSize = value; }
}
public override IDocumentPaginatorSource Source
{
get { return flowDocumentpaginator.Source; }
}
public override DocumentPage …Run Code Online (Sandbox Code Playgroud) 这不是"哪个是最快的ORM"的问题,也不是"如何用ORM编写好代码"的问题.这是另一方面:代码已经编写,它已经上线,数千名用户正在使用该应用程序,但是存在整体性能问题.SQL事件探查器跟踪只能运行很短的时间:5分钟可以产生数十万个结果.
问题很简单:使用SQL事件探查器缩小了许多慢查询(持续时间大于给定时间),有哪些技术和解决方案可以将这些SQL查询追溯到有问题的组件中?一个相关的问题是,如果某个特定区域很慢,我们如何识别该区域正在执行的SQL,以便在SQL事件探查器中对其进行适当过滤?
这背景是我们有一个相当大的应用程序,具有相当复杂的表结构,目前基于存储过程的数据访问.如果出现SQL性能问题,通常情况下是拉出SQL分析器,找出是否有任何缓慢(按持续时间过滤)或者被抱怨的区域是否缓慢(按存储过程过滤),并调整存储过程(或模式 - 通过索引).
现在推动我们的代码从一个主要的sproc解决方案转移到一个主要是ORM的解决方案,但是对这一举措的大力推动是性能问题如果出现,可以追溯到有问题的代码.我已经阅读过,似乎通常情况下,它可能涉及我们需要在服务器上安装的第三方工具(像NHProf或.NET跟踪实用程序,如dottrace的ORM跟踪实用程序).现在是否可以在实时环境中安装其他工具是另一个问题,因此如果可以在没有其他工具的情况下执行此类操作,那么这可能是一个奖励.
我最感兴趣的是使用SQL Server 2008的解决方案,但它对于任何RDBMS都可能是通用的.就ORM技术而言,我没有特别关注当前没有使用的内容,因此有兴趣了解技术如何区别(或常见)twixt nHibernate,fluent-nhibernate和Entity Framework.如果他们提供其他东西,欢迎其他ORM :-)
我已经阅读了如何查找和修复性能问题(...),我认为问题只是那里的"隔离"部分.仅在现场系统上易于重现的问题将难以隔离.我在第2段中引用的数字是我们可以从个人资料中获得的数量类型的数字......
如果你有现场ORM跟踪的实际经验,那就更好了:-)
更新,2016-10-21:为了完整起见,我们最终通过编写代码和重写NHibernate方法为NHibernate解决了这个问题.我问的其他SO问题的全部细节:NHibernate和Interceptors - 测量SQL往返时间.我希望这对于许多不同的ORM来说都是类似的方法.
在切换到使用 SQL Native Client (SQLNCLI) 作为 ADO 提供程序时,我们的旧应用程序遇到了问题。
我们原来的连接字符串是:
Provider=SQLOLEDB; Server=host; Database=bob; Integrated Security=SSPI;
Run Code Online (Sandbox Code Playgroud)
我们将其更改为:
Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;
Run Code Online (Sandbox Code Playgroud)
我们发现,在调用存储过程时,使用 adDBTimeStamp 参数,Native Client 似乎将时间戳视为 smalldatetime,而不是 datetime。这给我们带来了问题,因为我们在某些比较中使用 9999 年 12 月 31 日作为“最高端”日期,而 Native Client 因“无效日期格式”错误而失败,而 SQLOLEDB 没有问题。
现在看起来我们可能只能在创建参数时将 adDBTimeStamp 更改为 adDate 作为数据类型,但是我想知道在我们继续进行代码更改之前,连接字符串中是否缺少某些内容。
VBScript 代码重现如下。为免生疑问,在有人建议我们应该使用 12/31/9999 之前,日期格式是 UK (dd/mm/yyyy) :-) 但还要确认一下,CDate 不会失败。
Set db = CreateObject("ADODB.Command")
' If Provider=SQLOLEDB then there is no error.
db.ActiveConnection = "Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;"
db.CommandText = "usp_FetchData"
db.CommandType = &H0004
' …Run Code Online (Sandbox Code Playgroud) //你好,我试图让我的代码工作我的比较如果字符串更大或小于10,但它无法正常工作.即使该值小于10,它也会写入10或更多.
int result = string1.CompareTo("10");
if (result < 0)
{
Console.WriteLine("less than 10");
}
else if (result >= 0)
{
Console.WriteLine("10 or more");
}
Run Code Online (Sandbox Code Playgroud) 我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个与原始代码相当接近的类型库。
在早期绑定到其他 VB6 组件时,我遇到了传递参数数组的问题。在最初的 VB6 中,签名如下所示:
Public Function ExecSPReturnRS(ByVal strProcAs String, _
ParamArray varParams() As Variant) As Recordset
Run Code Online (Sandbox Code Playgroud)
并生成如下所示的 MIDL:
[id(0x60030009), vararg]
HRESULT ExecSPReturnRS([in] BSTR strProc,
[in, out] SAFEARRAY(VARIANT)* varParams,
[out, retval] _Recordset** );
Run Code Online (Sandbox Code Playgroud)
使用 C#,我无法确定生成相同 MIDL 的正确声明。我要么缺少vararg声明,要么 varParams 参数被声明为而SAFEARRAY(VARIANT)不是SAFEARRAY(VARIANT)*.
因此,如果在 C# 中我声明为:
Recordset ExecSPReturnRS(string storedProc, ref object[] arguments);
Run Code Online (Sandbox Code Playgroud)
...我明白了SAFEARRAY(VARIANT)*,但没有vararg。但是如果我声明为
Recordset ExecSPReturnRS(string storedProc, params object[] arguments);
Run Code Online (Sandbox Code Playgroud)
...然后我得到了vararg但 SAFEARRAY 未声明为引用。
我希望这MarshalAsAttribute可能是可行的方法,但到目前为止我能想到的最好方法是:
Recordset …Run Code Online (Sandbox Code Playgroud) 我目前正致力于使用RSACryptoServiceProvider执行主密钥加密和解密操作,使用随机生成的加密密钥对来自智能卡的X509证书加密大量文本进行加密.但是,当我将fOEAP填充选项设置为true时,每次解密时都会出现"解码OAEP填充时出错"错误.我检查了密钥大小,它在可接受的范围内.我已经通过断点来确保从加密函数返回的Base64字符串与加密的Base64字符串完全相同,当再次加载文件时,该字符串将被传递回解密函数.
密钥对绝对是正确的,因为没有OAEP它可以正常工作.我也检查了文本编码.
编辑:事实证明,这可能是一个特定于智能卡的问题,当我尝试使用本地X509证书进行解密时,解密成功了.
编辑:这是失败的解密代码:
string TestString = "Hello World!";
X509Certificate2 cert = DRXEncrypter.GetCertificate("Select a test certificate", "Select a certificate to use for this test from the local store.");
string key = DRXEncrypter.GenerateEncryptionKey(214);
Console.WriteLine("Encryption Key: " + key);
string encrypted = DRXEncrypter.EncryptBody(TestString, key);
Console.WriteLine("Encrypted Body: " + encrypted);
string cryptokey = DRXEncrypter.EncryptWithCert(cert, key);
Console.WriteLine("Encrypted Decryption Key: " + cryptokey);
string decrypted = DRXEncrypter.DecryptBody(encrypted, cryptokey, cert);
Console.WriteLine("Decrypted Body: " + decrypted);
Console.WriteLine("Output String: " + decrypted + ".");
Run Code Online (Sandbox Code Playgroud)
这是我编写的加密提供程序类的代码.我已经坚持这个问题几个小时,所以如果有人可以帮助我,那将是很棒的.
using System;
using …Run Code Online (Sandbox Code Playgroud) c# ×4
vb6 ×3
header ×2
ado ×1
apartments ×1
com ×1
com-interop ×1
cryptography ×1
encryption ×1
flowdocument ×1
iphone ×1
macos ×1
nhibernate ×1
orm ×1
performance ×1
printing ×1
smartcard ×1
soap ×1
spacing ×1
sqlncli ×1
string ×1
vbscript ×1
wpf ×1
wsse ×1
xcode ×1