0

我正在尝试使用与默认频道不同的频道连接到我的 TeamSpeak3 服务器。

文档说:

-defaultChannelArray

定义 TeamSpeak 3 服务器上通道路径的字符串数组。如果频道存在并且用户有足够的权限并在需要时提供正确的密码,则频道将在登录时加入。

要定义任意级别的子通道的路径,请创建一个通道名称数组,详细说明默认通道的位置(例如“grandparent”、“parent”、“mydefault”、“”)。数组以空字符串结束。

传递 NULL 以加入服务器默认频道。

这是函数签名:

unsigned int ts3client_startConnection(uint64 serverConnectionHandlerID,     
                                       const char* identity,     
                                       const char* ip,   
                                       unsigned int port,    
                                       const char* nickname,     
                                       const char** defaultChannelArray,     
                                       const char* defaultChannelPassword,   
                                       const char* serverPassword);  

TeamSpeak 的 C# 示例运行良好,它使用如下方法:

string defaultarray = "";
/* Connect to server on localhost:9987 with nickname "client", no default channel, no default channel password and server password "secret" */
error = ts3client.ts3client_startConnection(scHandlerID, identity, "localhost", 9987, "client", ref defaultarray, "", "secret");
if (error != public_errors.ERROR_ok) {
    Console.WriteLine("Error connecting to server: 0x{0:X4}", error);
    Console.ReadLine();
    return;
}

在他们的代码中导入 DLL 时,他们使用这个:

[DllImport("ts3client_win32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ts3client_startConnection", CharSet = CharSet.Ansi)]
public static extern uint ts3client_startConnection(uint64 arg0, string identity, string ip, uint port, string nick, ref string defaultchannelarray, string defaultchannelpassword, string serverpassword);

现在我的问题是:使用 C#,我试图将非默认通道数组传递给该方法,但它运行得不是很好。

我尝试了以下方法但无济于事:

string defaultarray = """name"", """"";
string defaultarray = "name,";

在执行以下操作时,我总是会出错:

string defaultarray = "";

ts3_client_minimal_sample.exe 中出现“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

如何从 C# 获取字符串数组到 C++ DLL,同时不使用 String[]?

谢谢!

4

1 回答 1

0

谢谢你,凤凰!

最初的答案没有帮助,但更进一步的答案是:esskar's answer

更新代码:

[DllImport("ts3client_win32.dll", CallingConvention =   CallingConvention.Cdecl, EntryPoint = "ts3client_startConnection", CharSet = CharSet.Ansi)]
public static extern uint ts3client_startConnection(uint64 arg0, string identity, string ip, uint port, string nick, string[] defaultchannelarray, string defaultchannelpassword, string serverpassword);
...
string[] defaultarray = new string[] { "name", ""};
/* Connect to server on localhost:9987 with nickname "client", no default channel, no default channel password and server password "secret" */
error = ts3client.ts3client_startConnection(scHandlerID, identity, "localhost", 9987, "client", defaultarray, "password", "secret");
if (error != public_errors.ERROR_ok) {
    Console.WriteLine("Error connecting to server: 0x{0:X4}", error);
    Console.ReadLine();
    return;
}

基本上,我将 DllImport 更改为string[] defaultChannelArrayfrom ref string defaultChannelArray。正如该线程的另一位评论者所提到的,C# 数组作为引用传递。然后我传递了一个简单的 C# 字符串数组。完美运行!

我让它变得比它需要的更复杂。

于 2016-08-26T14:52:33.580 回答