2011-03-08 3 views
7

내가 지금이마샬링 된 문자열의 소유권을 가져올 지 여부를 지정하는 방법은 무엇입니까?

MYDLLEXPORT 
const char* f1() 
{ 
    return "Hello"; 
} 

MYDLLEXPORT 
const char* f2() 
{ 
    char* p = new char[20]; 
    strcpy(p, "Hello"); 
    return p; 
} 

과 같은 C++에서 x.dll이 있다고 가정의 강력한 소유권을 CLR을 말할 수있는 방법이 있나요 내가 C#

[DllImport("x.dll")] 
public static extern string f1(); 

[DllImport("x.dll")] 
public static extern string f2(); 

을이을에 사용한다고 가정 f2에서 반환 된 문자열은 아니지만 f1에서 반환 된 문자열입니까? 문제는 f1에서 반환 된 문자열이 결국에는 해제되거나 삭제되거나 GC에 의해 무엇이든지된다는 사실은 f2에서 반환 된 문자열이 그렇지 않다는 사실에도 똑같이 나쁘다는 것입니다. 희망의 질문은 분명했다. 미리 감사드립니다.

답변

4

dll 구현 전반에 영향을 미쳤다면, 예제에서 보여준 것처럼 그렇게하지 않는 것이 좋습니다. 그렇지 않으면 제약 조건을 언급하도록 질문을 구체화하십시오.

dll에서 힙 할당 문자열을 반환해야하는 경우 정리 기능 (dll에서 동적으로 할당 된 메모리를 내보낼 때 항상 좋은 방법)을 제공해야합니다. 당신은 IntPtr의 반환과 함께 할당 함수를 호출하고 Marshal.PtrToString... 중 하나를 사용하여 http://msdn.microsoft.com/en-us/library/atxe881w.aspx에 마샬링하고 사물의 원시 측에 대한 정리 함수를 호출하여 마무리합니다. 기본

: 관리

__declspec(dllexport) 
void bstrtest(BSTR *x) 
{ 
    *x = SysAllocString(L"Something"); 
} 

: PInvoke for C function that returns char *

: 난 그냥 SO에 비슷한 질문을 발견

[DllImport("mydll.dll")] 
extern static void bstrtest(ref IntPtr dummy); 

static void Main(string[] args) 
{ 
    var bstr = IntPtr.Zero; 
    bstrtest(ref bstr); 

    var text = Marshal.PtrToStringBSTR(bstr); 
    Console.WriteLine(text); 

    Marshal.FreeBSTR(bstr); 
} 

또 다른 방법은 BSTR (Marshaling BSTRs in COM/Interop or P/Invoke에서 예)를 사용하는 것입니다

+0

감사합니다. 죄송합니다. 일일 한도에 도달 할 수 없으므로 제공하신 링크가 필요합니다. –

+0

@Armen : 내일 다시 올 수 있습니다 ...;) –

관련 문제