【发布时间】:2011-07-27 00:33:16
【问题描述】:
这个真的把我难住了。我正在与另一个开发人员一起工作,他打电话给我,因为他无法相信他所看到的。我们一起调试调试器,我也看到了,没有解释。这是场景。他正在编写一个通过自动生成的 COM 包装器与第 3 方 COM 对象交互的方法(通过添加 COM 组件作为引用简单地生成。这是他方法的顶部:
public bool RefolderDocument(ref IManDocument oDoc)
{
string strCustom1 = (string) oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1);
string strCustom2 = (string) oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom2);
代码的目的是从“文档”对象 (oDoc) 中获取项目编号和子项目编号。
当您逐步完成时,会发生以下情况。在第一次分配 strCustom1 具有预期值“32344”(项目编号)后,strCustom2 为空,如预期的那样。第二次赋值后,strCustom2得到了子项目号“0002”——但是strCustom1已经改成了32334——改了一个字符!?
让我印象深刻的是某种老式的 c 语言堆栈溢出(即使托管应用程序与 COM 组件互操作,我也不会想到这种情况)。我们都很困惑。为了解决这个奇怪的问题,我尝试将第一个字符串的内容复制到另一个位置,如下所示:
public bool RefolderDocument(ref IManDocument oDoc)
{
string strCustom1 = string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1));
string strCustom2 = string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom2));
同样的结果!在这一点上,我们抓住了救命稻草,将代码从 .NET 4 删除到 .NET 3.5 (CLR 2),但没有任何变化。一个可能相关的点是,这是一项服务,我们正在附加到服务流程。构建目标是 x86,服务位置肯定在 Debug 输出构建文件夹中。
对此有什么合乎逻辑的解释吗?我不知道如何继续。
【问题讨论】: