【问题标题】:How to return a string from native code to managed code in Windows Azure?如何将字符串从本机代码返回到 Windows Azure 中的托管代码?
【发布时间】:2011-08-17 07:19:07
【问题描述】:

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

但是,当我修改它时,我遇到了一些无法预料的错误。

我希望它返回一个字符串并在 C# 代码中显示该字符串,而不是从非托管代码返回和显示 int。所以在我的实验中,我将函数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() 转换为要显示的字符串。

所以基本上,有人可以告诉我如何修改教程以显示字符串而不是 int。

【问题讨论】:

    标签: c# .net c++ interop azure


    【解决方案1】:

    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";
    }
    

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

    Here's the MSDN article 更详细地解释了数据编组。

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 2011-01-21
      • 2011-09-06
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多