Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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
将字符串从c#编组到c++;_C#_C++_String_Marshalling_Dllimport - Fatal编程技术网

将字符串从c#编组到c++;

将字符串从c#编组到c++;,c#,c++,string,marshalling,dllimport,C#,C++,String,Marshalling,Dllimport,我是微软世界的新手。 我在尝试将简单字符串从c#传递到dll/c时遇到了很多问题++ 我已经读了很多文章和文档,但是问题是一样的 C++代码 extern "C" __declspec(dllexport) int Init( long l , char* url ); C#代码 haeppen的意思是,当字符串参数为 0x00000000 <Bad Ptr> 0x00000000 你能帮我。。。我真的很困惑 谢谢 Ag你应该传递一个字符串,URL应该是字符串类型,而不是Str

我是微软世界的新手。 我在尝试将简单字符串从c#传递到dll/c时遇到了很多问题++ 我已经读了很多文章和文档,但是问题是一样的

C++代码

extern "C" __declspec(dllexport) int Init( long l , char* url );
C#代码

haeppen的意思是,当字符串参数为

0x00000000 <Bad Ptr>
0x00000000
你能帮我。。。我真的很困惑 谢谢
Ag

你应该传递一个字符串,URL应该是字符串类型,而不是String Bu建d.t/p>

这是因为你的编排不正确:C++中的代码>长和 INT/C> > C(c)中的(通常)int >代码> .< /P>

,你需要:

唯一需要注意的是,必须为StringBuilder分配足够的空间用于返回值,否则文本将溢出,导致p/Invoke引发异常

也来自

  • 不要通过引用传递StringBuilder(使用out或ref)。否则,CLR将期望此参数的签名为wchar_t**而不是wchar_t*,并且它将无法固定StringBuilder的内部缓冲区。性能将大大降低
  • 当非托管代码使用Unicode时,请使用StringBuilder。否则,CLR将不得不复制字符串并在Unicode和ANSI之间进行转换,从而降低性能。通常,您应该将StringBuilder封送为Unicode字符的LPARRAY或LPWSTR
  • 始终提前指定StringBuilder的容量,并确保容量足以容纳缓冲区。非托管代码端的最佳实践是接受字符串缓冲区的大小作为参数,以避免缓冲区溢出。在COM中,还可以使用IDL中的size_指定大小

因此,在您的示例中,您需要指定本机大小作为
StringBuilder
的参数,如下
StringBuilder str=new StringBuilder(size\u of_native\u STRING)

尝试在dll函数参数中使用LPCSTR

extern "C" __declspec(dllexport) int Init( long l , **LPCTSTR** url );
下面是一个很好的例子,我发现如何做到这一点

C++:


我做了一个快速查找-StringBuilder对unicode很有用,这可能是它存在的原因。不,显然不是,因为它仍然存在
int
/
long
问题…)(另外:为什么
StringBuilder
不起作用?您不能将其作为
[In,Out]
传递吗?)@Lambert-StringBuilder被默认作为[InAttribute,OutAttribute]传递为什么这不好是因为传递long会导致将较高的32位(即0x00000000)用作
url
参数的值,解释所观察到的问题。脚注:IIRC,这只适用于32位系统。64位系统在寄存器中传递参数,因此您可能会错误地得到正确的结果,因为无论参数是否为64位,寄存器都是64位的。C++外部“C”,yDeSPECK(dL导出)int init(int L,LPCTSTR URL);注意,我将char *转换为LPCSTR数据类型C [dLimPART](“MCREDERDER .DLL”,字符集=字符集,Unicode)/ /强制字符集,没有Unicode i,在C++侧公共静态外部int(int a,string url)中的变量URL中捕获奇怪字符;IntPtr hndl=renderPanel.Handle;字符串url=textBox1.Text;Init(hndl.ToInt32(),url);希望这对你有用。。。谢谢大家。
extern "C" __declspec(dllexport) int Init( long l , **LPCTSTR** url );
extern "C" __declspec(dllexport) void doSomething(LPCTSTR asString)
{
    std::cout << "here" << (wchar_t)asString << endl;
    system ("pause");
}
class Program
{
    static void Main(string[] args)
    {
        String myString = "String in C#";
        doSomething(myString);
    }
    private const String path = @"C:\testdll2.dll"; //Make sure that the DLL is in this location

    [DllImport(path)]
    private static extern void doSomething(string asString);
}