C# 将字符串值从非托管代码传递到托管代码?

C# 将字符串值从非托管代码传递到托管代码?,c#,visual-c++,unmanaged,managed,C#,Visual C++,Unmanaged,Managed,嗨,我正在从非托管代码返回一个LPTSTR类型的对象,它本质上指向一个字符串。我现在在托管代码中,无法在C#中读取它。返回的字符串只是“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy” 这是我的托管代码片段 [DllImport("TableConfig.dll", EntryPoint = "?getTableConfigDlg@@QAEPA_WXZ", CharSet = CharSet.Ansi)]

嗨,我正在从非托管代码返回一个
LPTSTR
类型的对象,它本质上指向一个字符串。我现在在托管代码中,无法在C#中读取它。返回的字符串只是“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”

这是我的托管代码片段

[DllImport("TableConfig.dll", EntryPoint = "?getTableConfigDlg@@QAEPA_WXZ", CharSet = CharSet.Ansi)]
        static extern String getColumnNamesFormat();
这有什么问题吗??? 如何从非托管代码返回的字符串中获取有意义的数据

谢谢

本机代码:-

for(int i=0; i<numCols; ++i)
{
    const bet_TableConfigColumn *col_p = tc_p->getColumn(i);
    const char* colName = tc_p->getKeyName(i);
    const char* colFormat = col_p->getFormat();
    str+=",";
    str+=colName;
    cout << "Col Name" << colName << "Format: " << colFormat;

} // end of for(i)
         LPTSTR pString=str.GetBuffer(0);
            str.ReleaseBuffer();
      return pString;
for(int i=0;igetColumn(i);
const char*colName=tc\u p->getKeyName(i);
const char*colFormat=col_p->getFormat();
str+=“,”;
str+=colName;
无法管理:

DllImport("TableConfig.dll", EntryPoint = "?getTableConfigDlg@@QAEPA_WXZ")]
static extern void getColumnNamesFormat( StringBuilder tableNames );

StringBuilder result = new StringBuilder( 255 );
getColumnNamesFormat( result );
本地人:

将方法签名更改为返回void,接受托管缓冲区的LPTSTR

_tcscpy(managedBuffer, str);

这是一个暗箱操作,但是您的本机函数是否返回堆栈上分配的对象?如果是,您不能这样做


一旦你解决了这个问题,你就可以开始考虑在内存不再可用后如何处理它,否则你的手上就会出现内存泄漏。

如果这是问题,他会得到一个字符。@Blindy good point。建议的解决方案有什么问题吗?没有,我仍然收到垃圾,全部正确角盒…:::(:)我试过uni,ansi,都不管用…刚贴在上面…请看一看look@Geek返回str.GetBuffer(0);并使用Marshal.PtrToStringUni()要阅读string.Okie,我可以随意更改设计,对于这些需要在托管和非托管之间来回传递字符串的问题,最佳做法是什么???显示本机代码,特别是处理分配和传递字符数组的代码。for(int i=0;igetColumn(i);const char colName=tc_p->getKeyName(i);const char*colFormat=col_p->getFormat();str+=“,”;str+=colName;难道这是你的问题,你在返回缓冲区之前释放缓冲区,所以只有垃圾到达另一端。@blindy:我不认为这是问题所在。我删除了行,但它也不起作用。我仍然得到相同的垃圾值…尝试将托管外部中的返回值更改为StringBuilder。根据o DllImport文档中,StringBuilder应用于[输出]参数或返回值。另外,请确保检查LPTSTR的定义。如果为非托管生成定义了UNICODE,则实际上它将是wchar_t*,在这种情况下,您希望字符集使用UNICODE而不是Ansi。不,当控件从非托管函数返回时,该值似乎消失了。