2009-07-31 4 views
0

내 C# 응용 프로그램에서 InParameter를 VC++ DLL의 내 보낸 함수로 전달해야합니다.C#에서 C++로 마샬링

int func_name (FILE* fp, BYTE& by); 

fp가이고 by 파라미터 밖으로 : 함수는 2 개 매개 변수를 수용한다.

FILE*의 경우 IntPtr을 사용하고 BYTE의 경우 바이트를 사용하여 마샬링을 고려했습니다. 맞습니까? 내가 C#으로 다음을 작성한다면

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int  func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by); 

이게 작동할까요? 마샬링 문에서 '&'기호에 오류가 발생한다고 생각합니다. out 매개 변수를 참조로 전달하는 방법은 무엇입니까?

귀하의 도움을 많이 주시면 감사하겠습니다.

감사합니다, Viren

답변

1

네이티브 함수가 참조를 기대하는 경우 ref/out을 사용하여 마샬링 할 수 있습니다. 따라서 상황에 따라 다음을 사용할 수 있습니다. out byte by. 나는 그것을 검사했고, 그것은 나를 위해 일한다.

다시 편집 : 그냥 내 마음에 왔어. 내가 준 조언은 작동하지 않을거야, FILE이 구조체 같아서, C#에서 마샬 할 수 없을거야. 따라서 흠집을두면 관리되지 않는 라이브러리에서 HANDLE 객체로 SafeFileHandle을 위협 할 경우이 접근 방식을 사용할 수 있습니다. 이 DLL을 수정할 수없는 경우, 하나 개의 솔루션은 표준 입출력을 사용하여 파일을 만들기위한 자신의 래퍼를 만드는 것입니다, 그것은 다음과 같을 수 있습니다 :

  1. , FCLOSE 등 철하면 fopen의 기능을 노출하는 라이브러리를 작성합니다. (C++에서) :
    FILE* CreateFile(char* name);
  2. Marhall이 기능이 예에서 사용 것 (C#을) :
    public static extern IntPtr CreateMyFile([MarshalAs(UnmanagedType.LPStr)] string name);
  3. 마샬 모든 파일 *의를 IntPtr의 매개 변수, 그리고 단지 FILE 같은 기능 CreateMyFile의 결과를 전달합니다 * .
+0

Ravadre에게 감사드립니다. 하지만 여전히 FILE * 형식 마샬링이 붙어 있습니다. 제 4 바이트 부호없는 정수를 사용해야합니까? 지금 테스트 할 코드가 없습니다. ] 공공 정적 통근자의 INT의 FUNC_NAME (U4 파일 포인터, 바이트로부터으로 (charset에서 = CharSet.Ansi "name_of_project.dll") 같이 DllImport : 나는 곧 그것을 얻을 것이다 그리고 지금 나는 다음과 같은 생각하고 들어 .. 최대한 빨리 여기에 업데이트됩니다); – zack

+0

Uf, 미안 모든 편집을 위해, 나는이 해결책을 점검하고 꽤 잘 작동합니다. –

+0

cool..thats 깨끗한 아이디어 .. 내 생각 엔 .. 감사합니다. – zack

2

아니요, 이것은 작성된대로 작동하지 않습니다.

  1. C# 프로그램에서 어디에서 FILE*을 얻을 예정입니까? 관리되지 않는 dll의 다른 함수가이 포인터를 제공하지 않으면 문제가 발생합니다. BTW 나는 SafeHandle에이 FILE*을 배치하는 것이 좋습니다. p/invoke 서명은 베어 IntPtr 대신 SafeFilePointer을 사용합니다.
  2. 마샬링 할 바이트 수는 몇 바이트입니까? 하나 인 경우 out byte by을 관리되는 서명에 넣습니다 (속성은 필요하지 않음).
  3. char 또는 string을 마샬링하지 않으므로 charset을 지정할 필요가 없습니다.
+0

1 바이트 만 마샬링합니다. 따라서 FILE *을 마샬링하라는 진술을 제안 해주십시오. .NET 프로그래밍을 처음 접했고 SafeHandle로 FILE *을 래핑하는 것에 대해 전혀 모른다. 고마워요, Viren – zack

+0

나 자신을 되풀이합니다 - 당신은 그 파일을 어디에서 얻고 있습니까?파일을 열어야합니까, 아니면 무엇을 열어야합니까? –

+0

내 C# 응용 프로그램에서 가져올 C++ DLL에서 내 보낸 int func_name (FILE * fp, BYTE & by) 있습니다. 내 C# 응용 프로그램에서 이진 파일을 열고 가져온 된 함수 핸들을 전달할 inted. 아직 C#에서 핸들을 얻는 방법을 잘 모르겠습니다. 나는 우리가 C#에서 바이너리 파일을 열 수 있고 File * fp = _tfopen (path, mode)를 사용하여 C++에서하는 것처럼 핸들을 얻을 수 있다고 가정한다. – zack