簡體   English   中英

如何將這個字符數組參數從C編組為C#中的字符串?

[英]How can I marshal this character array parameter from C to a string in C#?

我有以下函數,作為C中另一個類的一部分編寫的:

int example(char *remoteServerName)
{
    if (doSomething(job))
        return getError(job);
    if (job->server != NULL) {
        int length = strlen(jobPtr->server->name); // name is a char * of length 1025
        remoteServerName = malloc (length * sizeof(char));
        strncpy(remoteServerName, jobPtr->server->name, length);
    }
    return 0;
}

如何從中獲取remoteServerName 我嘗試了以下方法:

[DllImport("example.dll")]
public static extern int example(StringBuilder remoteServerName);

var x = new StringBuilder();
example(x);
Console.WriteLine(x.ToString());

但是字符串始終為空。

您需要為返回的字符串分配一些空間。

var x = new StringBuilder();

提供容量值:

var x = new StringBuilder(1024);

您還應該刪除對malloc的調用。 調用方分配內存。 這就是與StringBuilder編組的目的。

您沒有正確使用strncpy ,因此無法編寫空終止符。 您可以像這樣傳遞緩沖區長度:

int example(char *remoteServerName)
{
    if (doSomething(job))
        return getError(job);
    if (job->server != NULL) {
        // note that new StringBuilder(N) means a buffer of length N+1 is marshaled
        strncpy(remoteServerName, jobPtr->server->name, 1025);
    }
    return 0;
}

但這將有點浪費,因為它隱含了所有的零填充。 確實, strncpy是無用的,您應該使用其他函數來復制,就像之前在這里多次討論的那樣。 我真的不想被這個問題吸引住,因為這個問題有點離題。

設計API以允許調用者也傳遞字符數組的長度是明智的,這樣被調用者可以確保不溢出緩沖區,從而無需在此處使用魔術常數作為代碼。做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM