如何在Windows Azure中从本机代码返回字符串到托管代码

How to return a string from native code to managed code in Windows Azure?

本文关键字:返回 本机代码 字符串 托管代码 Windows Azure      更新时间:2023-10-16

我发现这个关于如何在Windows Azure上互操作c#代码和非托管c++代码的教程非常有帮助http://msdn.microsoft.com/en-us/hh351534

然而,当我修改它时,我遇到了一些不可预见的错误。

不是从非托管代码返回和显示int,我希望它返回一个字符串并在c#代码中显示该字符串。在我的实验中,我将函数AddNumbers()

NATIVECALCULATOR_API int AddNumbers(int left, int right){
    return left+right;
}

NATIVECALCULATOR_API char *AddNumbers(int left, int right){
    return "a string";
}

,这样当我点击ASP的按钮。. NET页面,它将返回"一个字符串"。

然而,在default.aspx.cs中,网页代码隐藏文件,它告诉我我不能改变

static extern int AddNumbers(int left, int right);

static extern char *AddNumbers(int left, int right);

因为"指针只能在不安全的上下文中使用"

从那里我尝试了很多方法,但我无法将AddNumbers()转换成字符串来显示。

谁能告诉我如何修改教程来显示字符串而不是整型。

c#试图告诉你的是,它不会让你心甘情愿地使用原始指针。值得庆幸的是,我们仍然可以通过数据封送将字符串(甚至是原始字符字符串)从非托管代码传递到托管代码。对于字符串,系统将c++中的char*转换为c#中的string

对于您的特定问题,将default.aspx.cs中的AddNumbers

更改
static extern int AddNumbers(int left, int right);

static extern string AddNumbers(int left, int right);

同样,将c++代码改为如下

NATIVECALCULATOR_API char* AddNumbers(int left, int right)
{
    return "a string";
}

数据编组应该正确地将字符串从一个传递到另一个。

这里是MSDN的文章,更详细地解释了数据编组。