2014-10-10 3 views
1

내가 계산하고 생산되는 교류 # DLL을 쓰고 있어요 ++/CLI C에 의해 호출 DLL을 반환하는 방법 : -이 기능은 C++/CLI 프로젝트에 의해 호출됩니다 바이트 배열, C#을 DLL에서 UINT 값

-byte array [byte array] 
-unit  [2 byte error code] 
-bool  [true/false for success and failure] 

. 함수는 하나의 값만 반환 할 수 있지만 C# 함수를 실행 한 후이 값이 필요합니다.

C#의 함수 원형 및 C++/CLI 코드의 호출 방법은 무엇입니까?

미리 감사드립니다.

+2

그냥 바이트 [을 반환하는 방법을 쓰기 ]. C++/CLI에서는'array ^'입니다. "오류 코드"는 예외 사항이어야합니다. –

+0

@HansPassant : 실제로 장애가 예상되는지 여부에 달려 있습니다. 예 : 외국 데이터 입력을 구문 분석 할 때 잘못된 입력이 실제로 예외는 아닙니다. –

답변

1

아마도 out 수정자를 사용할 수 있습니다.

void MyMethod(out byte[] ba, out short code, out bool success) 
{ 
    ... 
} 

바와 같이 here 말, 호출은 다음과 같습니다

array<System::Byte>^ ba; 
Int16 code; 
bool success; 
MyClass::MyMethod(ba, code, success); 

난 그냥 그것을 테스트. 희망이 도움이됩니다.

+0

bool 성공이 반환 값이된다는 것을 제외하고는 tryXXX 패턴 ('TryParse','Dictionary :: TryGetValue' 등)을 언급 할만한 가치가 있습니다. –

+0

나는 심판을 사용했고 잘 작동한다. public bool READ_KEY (참조 코드 오류 코드, ref 바이트 [] temp, ref uint array_length) – Arjun

3

이 요소의 구조 또는 클래스를 반환 해보세요.

0

한스 패전트 (Hans Passant)는 의견에서 오류는 반환 값의 일부가 아니라 예외가되어야한다고 말했습니다. 당신이 구문에 문제가있는 경우, 여기에 내가 무엇을 할 것이라고입니다 :

C에서 # : C++/CLI에서

public class CSharpClass 
{ 
    public static byte[] Foo() 
    { 
     // ... 
     if (some error condition) 
     { 
      throw new SomeException(...); 
      // If you really want, write your own exception class 
      // and have the error code be a property there. 
     } 

     byte[] result = new byte[1024]; 
     return result; 
    } 
} 

:

public ref class CppCLIClass 
{ 
public: 
    static void Bar() 
    { 
     try 
     { 
      array<Byte>^ fooResult = CSharpClass::Foo(); 
      // Success, no error occurred. 
     } 
     catch (SomeException^ e) 
     { 
      // An error occurred. 
     } 
    } 
}