2016-09-29 1 views
1

저는 UWP 프로젝트에서 작업하고 있습니다. C#에서 C++로 위치 데이터의 배열을 보내고 싶습니다. (XAML의 위에 DirectX로 생성 된 메쉬를 렌더링하기 위해서입니다.)UWP 애플 리케이션의 배열을 C#에서 C++/Cx dll로 보내기

나는 이것을 시도했다 : Improper marshaling: C# array to a C++ unmanaged array (답 대답). 하지만 작동하지 않습니다, 나는 뭔가를 놓치고 있다고 생각하지만, 나는 무엇을 모릅니다. 그가 제안한 것을 시도 할 때, 제 컴파일러는 C++에서 선언 된 CInput 구조체에 대해 불평합니다. 왜냐하면 네이티브이기 때문에 공용 함수의 매개 변수가 될 수 없기 때문입니다. (C#을에서 호출되는 함수)이 내 코드

(나는 그 질문에 댓글을 것입니다,하지만 난 아직 권한이 없습니다.)

입니다 :

C#에서이 :

C에서
public struct CInput 
    { 
     public IntPtr array; 
    } 

    public VideoView() 
    { 
     InitializeComponent(); 
     Loaded += OnLoaded; 

     float[] test = new float[4]; 
     CInput input = new CInput(); 
     input.array = Marshal.AllocHGlobal(Marshal.SizeOf<float>() * test.Length); 
     Marshal.Copy(test, 0, input.array, test.Length); 
     D3DPanel.CreateMesh(out input, test.Length); 
     Marshal.FreeHGlobal(input.array); 
    } 

++ (D3DPanel.h에서) :

struct CInput 
{ 
    float* array; 
}; 

[Windows::Foundation::Metadata::WebHostHidden] 
public ref class D3DPanel sealed : public Track3DComponent::DirectXPanelBase 
{ 
public: 
    D3DPanel(); 

    void CreateMesh(CInput points, int length); 
} 

사람이 내가 잘못 뭘하는지 말해 줄 수 ?

편집 : here을 설명

내가의 PassArray 패턴을 시도하지만,이 오류 제공합니다

: "오류 C4400 'CONST의 INT'CONST가 /이 유형에 휘발성 예선이 지원되지 않습니다"
void CreateMesh(const Array<float>^ points, int length); 

"const Array ^"를 "Array"로 바꾸면 "구문 오류 : 식별자 'Array'"가 나타납니다.

+0

나는 받아 들여진 응답에서 쓰여진 것을하기 때문에 구조체를 사용하고 있습니다. 나는 네가하는 말을 정확히 이해하고 있는지 확신 할 수 없다. (실제로 나는 그렇지 않다는 것을 확신한다.) 내가 말하는 유형을 찾아보고 더 잘 이해할 수 있는지, 새로운 질문으로 다시 돌아가겠습니다. – Stef

+0

따라서 IVector를 사용하려면 IVector에서 상속받은 새로운 ref 클래스를 만들어 C++/CX 부분의 CIput 구조체 대신 사용하십시오. 그 맞습니까? 그래서 IVector에 정의 된 모든 기능을 구현해야합니까? – Stef

+0

Platform :: Array를 사용하려고하면 컴파일러에서 불평합니다. (오류 C2061 \t 구문 오류 : 식별자 '배열') – Stef

답변

1

당신은 인텔리 알 수 있듯이,

Platform::WriteOnlyArray<float>^ 

그것의 "OUT"유형과 유형 "의"의

const Platform::Array<float>^ 

를 사용하여 코드를 조금 수정해야합니다. C++/CX는 "in/out"유형을 지원하지 않습니다.

C++ 코드 할당에서 마샬링에 대한 걱정없이 배열을 직접 전달할 수 있도록 C++/CX에서 메모리 할당을하는 것이 좋습니다.

+0

예! 나는 실제로 근무 마지막 날 마지막 금요일을 발견했다. 실제로 예상보다 훨씬 간단합니다. 마샬링을 할 필요도 없습니다. 그래서 내가 찾은 PassArray 패턴은 트릭을 수행합니다. Intellisense는 Intellisense가 제안했지만 내 Intellisense가 제안하지 않은 것은 C#이 아닌 C++/CX에서만 작동하는 것 같습니다. 그 이유는 내가 그 "플랫폼 ::"(거기에 깨닫기 위해 몇 시간이 걸렸습니다, 우르르)을 놓는 것을 잊어 버렸습니다. 나는 Intellisense가 그것을 고치는 데 익숙합니다. : s – Stef

+0

놀랍게도 C++/CX에서 public 값 구조체를 만들고 C#에서 직접 그 유형을 사용할 수도 있습니다! (모든 배열 데이터를 저장하기 위해 배열에서 사용한 형식입니다.) – Stef