-1

C# からマネージ C++ に SlimMath 行列をできるだけきれいに FLOAT* として取得する必要があります。これまでのところ、私の試みはすべて汚れていて壊れています。コードは次のようになります。

C#

Matrix m = Matrix.Identity;
//.......(transform matrix)
//.......Convert it to something I can get into c++ ??
myManagedCPPFunction(m.ToArray());

c++

void myClass::myManagedCPPFunction(?? matTransform)
{
    //FLOAT* f = reinterpret_cast<FLOAT*>(&matTransform); //Cant do this cause managed code
    otherClass->Go((FLOAT*)matTransform);
}

//This is existing code I'm trying to get to:
class otherClass
{
public:
virtual void STDMETHODCALLTYPE Go(const FLOAT *pTransformMatrix);
}

一緒に仕事をするのに十分な意味があることを願っています。

ありがとう!

編集、これはすでに文字列と通常のフロートで機能していることを忘れていました。これは、float[] -> float* だけでは機能していないようです。

この方法で動作させることができましたが、理想的ではありません:

unsafe
{
    fixed (float* f = m.ToArray())
        myManagedCPPFunction(f);
}

明らかな理由から、それをしないことをお勧めします。

OK、次のように動作していると思います(少なくともコンパイルして実行しますが、変換を試す必要があります):

void myClass::myManagedCPPFunction(SlimDX::Matrix^ matTransform)
{
     FLOAT* f = reinterpret_cast<FLOAT*>(&matTransform);
     otherClass->Go(f);
}
4

2 に答える 2

1

これは、C# で使用できるように C++ で宣言する方法です ( p/invokeチュートリアルを参照)。

extern "C" {
    __declspec( dllexport ) void STDMETHODCALLTYPE Go(float* pMatrix);

    void Go(float* pMatrix) {
       // do your stuff here. assume the matrix has 16 elements
    }
}

そしてC#で:

[DllImport("myDll.dll")]
public static extern void Go(float[] matrix);

サンプル C# コード:

Matrix m = myMatrix;
Go(m.ToArray());

編集: C++/CLI マネージ アセンブリを使用する場合は、次のように関数を宣言できます。

using namespace System;

public ref class Class1
{
    public:

        void Go(array<float> ^ pFloat)
        {
            ... 
        }
    };
于 2013-01-09T17:45:02.763 に答える
0

マネージド C++ の場合は、C# と同じ型を使用できます。次のように C++ メソッドを宣言しないのはなぜですか。

void myClass::myManagedCPPFunction(Matrix^ matTransform)
于 2013-01-09T22:32:54.213 に答える