Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
std::C#中的字符串? 我认为问题在我的C++函数里面,但是我尝试过这个< /P> C++ +DLL中的P>C++函数: bool __declspec( dllexport ) OpenA(std::string file) { return true; }_C#_C++_Dll - Fatal编程技术网

std::C#中的字符串? 我认为问题在我的C++函数里面,但是我尝试过这个< /P> C++ +DLL中的P>C++函数: bool __declspec( dllexport ) OpenA(std::string file) { return true; }

std::C#中的字符串? 我认为问题在我的C++函数里面,但是我尝试过这个< /P> C++ +DLL中的P>C++函数: bool __declspec( dllexport ) OpenA(std::string file) { return true; },c#,c++,dll,C#,C++,Dll,C#代码: 我得到一个例外,内存已损坏,为什么 如果我删除std::string参数,它工作得很好,但是对于std::string它就不工作。std::string和c#string彼此不兼容。据我所知,C++字符串对应于在C++中通过 char *或 WCARAYT**/COD>。 其中一个原因是std::string可以有许多不同的实现,而c#不能假设您使用的是任何特定的实现。尝试以下方法: bool __declspec( dllexport ) OpenA(const TCHAR* pF

C#代码:

我得到一个例外,内存已损坏,为什么

如果我删除std::string参数,它工作得很好,但是对于std::string它就不工作。

std::string和c#string彼此不兼容。据我所知,C++字符串对应于在C++中通过<代码> char *<代码>或<代码> WCARAYT**/COD>。
其中一个原因是std::string可以有许多不同的实现,而c#不能假设您使用的是任何特定的实现。

尝试以下方法:

bool __declspec( dllexport ) OpenA(const TCHAR* pFile)
{ 
   std::string filename(pFile);
   ...
   return true;
}
还应在DllImport属性中指定适当的字符集(unicode/ansi)


另一方面,与编组问题无关,通常会将std:string作为const引用传递:const std:string&filename

> P> >不能按你尝试的方式封送C++ STD::String。这里真正需要做的是编写一个包装器函数,它使用普通的
const char*
,并在引擎盖下转换为std::string

C++

C#


我知道这个话题有点老了,但对于未来的谷歌用户来说,这也应该可以(在C++中不使用char*)

C#:

C++:


std::wstring和System.string可以通过以下转换兼容:

C++:


更不用说std::string也是一个模板,它为互操作打开了另一个有趣的蠕虫罐。最合适的方法是使用char*并从中创建std::string。如果要将std::string返回到C#,则必须使用大小为std::string的size()+1的CoTaskMemAlloc分配一个char*,然后将memcpy std::string的data()分配到该缓冲区并返回它。容易的。注意:您必须使用CoTaskMemAlloc!如果定义了_UNICODE,则该std::string将无法编译。最好是做一个yfIFDEF,使用STD::WString或者简单地根据一个UnoDoE为TString做一个Type,也许你可以通过一个管理C++桥来解包这个字符串来解决它。这是一个关于这个主题的问题。你是什么意思?你有没有试过上面的代码,但它不起作用?我的意思是,有没有任何参考页说明它应该起作用,并定义了它起作用的要求?很抱歉,我找不到这个atm的参考(这是很久以前的事了)。但是,您可以尝试此页面:
bool __declspec( dllexport ) OpenA(const TCHAR* pFile)
{ 
   std::string filename(pFile);
   ...
   return true;
}
extern C { 
  void OpenWrapper(const WCHAR* pName) {
    std::string name = pName;
    OpenA(name);
  }
}
[DllImport("pk2.dll")]
public static extern void OpenWrapper( [In] string name);
public static extern bool OpenA([In, MarshalAs(UnmanagedType.LPStr)] path);
bool __declspec( dllexport ) OpenA(std::string file);
bool func(std::wstring str, int number)
{
  BSTR tmp_str = SysAllocStringLen(str.c_str(), str.size());
  VARIANT_BOOL ret = VARIANT_FALSE;

  // call c# COM DLL
  ptr->my_com_function(tmp_str, number, &ret);

  SysFreeString(tmp_str);

  return (ret != VARIANT_FALSE) ? true : false;
}