gpt4 book ai didi

c# - 从 C++ 传递到 C# 的字符串打印空白

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:17 25 4
gpt4 key购买 nike

#ifdef SERVER_TCP_EXPORTS
class __declspec(dllexport) Sock_Server
#else
class __declspec(dllimport) Sock_Server
#endif
{
public:
int Server(const char* strErr,int bufSize);
...
}

cpp file
int Sock_Server::Server(const char* strErr,int bufSize)
{
// do something and assign the string to strErr
(say) strErr = "Hello World";
return -1;
}

in C#
[DllImport("Hello.dll", EntryPoint = "Server" CallingConvention = CallingConvention.StdCall)]

private extern static int Server(StringBuilder strErr, int bufSize);

public static int Connect(StringBuilder strErr, int bufSize)
{
int res = Server(strErr,bufSize); /// when the calls come here, strErr is empty
return res; // res has the value -1
}

private void Form1_Load(object sender, EventArgs e)
{
int res = 0;
int bufSize = 4096;
StringBuilder strErr = new StringBuilder(bufSize+1);

res = Connect(strErr, bufSize); //when the calls come here, strErr is empty
MessageBox.Show(strErr.ToString()); // it has the value -1
}

我不是 C# 的人。我在发布之前做了一些阅读,并尝试了所有可能的组合,但由于某些原因它不起作用。我正在使用 Visual Studio 2013。我有几个问题

[Q1] 当我执行 MessageBox.Show(strErr.ToString()); 时在我的 C# 中,它只打印一个空字符串!如果有人能帮助我,我将不胜感激,因为我对这一切还很陌生。

[Q2] 如果我给 EntryPoint ="Server"我的代码不工作。它提示说,在 Hello.dll 中找不到服务器的输入点。因此,每次我都必须使用 dumpbin.exe 在我的 dll 中找到确切的条目,然后准确提供编译器如何为我创建

[DllImport("Hello.dll", EntryPoint = "?Server@Sock_Server@@QAEHPBDH@Z" CallingConvention = CallingConvention.StdCall)]

有没有更好的方法来做到这一点。这使代码变得更加紧凑

[Q3] 有没有办法调用 C++ 构造函数/析构函数。我确实需要调用它们。我已经通过其他方法调用了 C'tor,我知道这不是一个好主意。任何帮助将不胜感激.

谢谢。

最佳答案

我不认为这都与静态有关。这都是关于正确分配对象的。当从其他 C++ 调用时,同一段代码工作得很好。我稍微调整了代码。现在,我使用了 strcpy_s,它可以正常工作,因为在整理数据时,我正在丢失数据。

我还在等待 Q2 的答复。

关于c# - 从 C++ 传递到 C# 的字符串打印空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38687267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com