小编Ric*_*man的帖子

从C#编组"as string"参数

进入一个有趣的问题,我想知道是否有人可以帮助解释.我试过在互联网上搜索,似乎无法找到这个问题的答案.虽然我们有一个解决方案,但其他人可能遇到同样的问题,因为它是随机的,所以很难追查.

当计算机连接到客户公司网络时,我们有一个随机失败的应用程序(网络上没有大量信息).当我们将计算机带到我们的环境中时,它运行良好.失败是相当随机的,但在从C#调用到非托管第三方供应商DLL期间,我发现最好.我所拥有的跟踪之一(系统事件日志中只有几个故障提供了跟踪)指示在调用非托管DLL的参数编组期间RtlMoveMemory函数中的ntdll.dll失败.

对非托管函数的调用是:

ThirdParty.CxxxAutomationWrapper clientDLL = new ThirdParty.CxxxAutomationWrapper () ;

object Parameter1 ;
  :
string theValue = "abcde" ;
Parameter1 = theValue ;
  :
if ( Parameter1 is string )
{
    int returnCode = clientDLL.function ( Parameter1 as string ) ;
}
Run Code Online (Sandbox Code Playgroud)

客户端计算机上的调用会定期失败,但在Visual Studio(2010)中运行时始终有效.正确设置Parameter1的值(从不为null).

自从我将电话改为:

String parameter1String = Parameter1.ToString() ;
int returnCode = clientDLL.function ( parameter1String ) ;
Run Code Online (Sandbox Code Playgroud)

一切都很好.Parameter1的值非常受控制,在执行此代码之前不为null.

被调用的接口(clientDLL.function)定义为:

HRESULT function ( [in] BSTR parameter,
                   [out, retval] long *ret);
Run Code Online (Sandbox Code Playgroud)

由于我对c#中'as'语句的理解有限,我不明白为什么第一个版本失败了.任何人都可以帮助解释为什么在使用指定为"as string"的参数调用时失败?

c# string marshalling

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

标签 统计

c# ×1

marshalling ×1

string ×1