tr0yspradling
tr0yspradling

Reputation: 604

returning c string to a C# program

I have a C++ dll that has a function that returns a c string and I have a C# program that calls this function and returns the data to a C# string. Here's what I mean

__declspec(dllexport) const char* function (const char* str) {
        std::string stdString( str );
        std::cout << stdString.c_str() << std::endl; // this prints fine, no data loss
        return stdString.c_str();
}

And here's the C# code

  [DllImport("MyDLL.dll")]
  public static extern string function(string data);

  string blah = function("blah");
  Console.WriteLine(blah); // doesn't print anything... 

When I look into the locals it says variable 'blah' is equal to "".

What happened to the data?

Upvotes: 2

Views: 1729

Answers (1)

Hans Passant
Hans Passant

Reputation: 942109

Your C++ code is broken. You are returning a pointer to a local variable. It no longer exists after the function returns. This tends to work by accident in a C++ program but is strong Undefined Behavior. It cannot possibly work in an interop scenario, the pinvoke marshaler's use of the stack will overwrite the string.

A declaration that could work:

 void function (const char* str, char* output, size_t outputLength)

Use a StringBuilder in the [DllImport] declaration for the output argument and pass an initialized one with sufficient Capacity.

Upvotes: 4

Related Questions