如何设置一个C#方法
这真的让我难住了。 我正在和另一位打电话给我的开发者合作,因为他无法相信他所看到的。 我们一起调试了一下,我也看到了,没有任何解释。 这是场景。 他正在编写一种方法,通过自动生成的COM包装器(通过将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输出构建文件夹中。
这是否有合理的解释? 我很难理解如何继续。
看起来strCustom1和strCustom2都被设置为引用,返回到GetAttributeValueByID的结果。 我不知道为什么,看看其他人在这里(派克博士Skeet哈哈......)是否会有意思。
但在短期内,我认为你会发现这将为你解决问题......
public bool RefolderDocument(ref IManDocument oDoc)
{
string strCustom1 = "" + string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1));
string strCustom2 = "" + string.Copy((string)oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom2));
我的想法基本上是让它评估一个表达式,而不是直接与参考书一起工作......
马丁。
PS。 什么是string.Copy()?
COM对象可能没有遵循COM内存管理规则,并且它覆盖了CLR认为它拥有的内存。 简单的事情,比如不为GetEnumerator()创建一个新的对象,真的可以搞砸COM互操作和缓存。
您还必须认识到,COM调用实际上工作的方式是将字符串的引用传递给内存。 虽然你称它为:
str = oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1)
这实际上更像是:
hresult = oDoc.GetAttributeValueByID(imProfileAttributeID.imProfileCustom1,&str)
所以你可以看到COM对象有一个指向CLR内存的指针。
换句话说,看看COM对象,而不是你的.NET代码。
我遇到了与您所描述的类似的问题。
我的情况,.NET /编译器/ runtine / CLR工作得很好,唯一的问题是Visual Studio调试器显示不正确的值。 尝试将你的值写入例如System.Diagnostics.Trace或控制台,以检查这是否是你的情况。
链接地址: http://www.djcxy.com/p/6023.html