4

編集:安全でないコードを使用できます...projファイルを手動で編集する必要があります。

電話でネイティブC++コードを使用できるのに、WP8のC#が安全でないコードをサポートしないのはなぜですか(これは予期していませんでした)?つまり、rlyがやって来て、MicrosoftがC#を強制しようとしていることにとても失望しています。

WP8で将来これをサポートするMSの計画はありますか?シェーダー定数をC#からC ++に渡し、安全でないコードを使用してこのプロセスを最適化しますが、WP8では、PCと比較して非常に遅いデバイスでこれを実行するように強制され、非常にイライラします。

vector4をC++に渡す例として、次のようにします。

public unsafe void Set(Vector4 value)
{
    com.Set((int)&value, sizeof(Vector4));
}

次にC++で:

void ShaderVariableCom::Set(__int32 data, int size)
{
    void* ptr = (void*)data;
    if (vertexOffset != -1) memcpy(vertexBytes + vertexOffset, ptr, size);
    if (pixelOffset != -1) memcpy(pixelBytes + pixelOffset, ptr, size);
}

誰かが安全でないコードなしでこれを行うための良い速い方法を持っていますか?

4

2 に答える 2

1

解決策を見つけました。

単純なベクター型の場合は、次のようにします。

Marshal.StructureToPtr(vector, nativePtr, false);

配列の場合は次のようにします。

var data = new Vector[10];
int size = Marshal.SizeOf(data[0]);
for (int i = 0; i != data.Length; ++i)
{
    Marshal.StructureToPtr(data[i], nativePtr + (size * i), false);
}

誰かがより良い答えを持っているなら、それも知っておくとよいでしょう。

于 2013-01-21T06:10:01.217 に答える
0

これはまさに、(サンドボックスの整合性を維持しながら) C++/CX が対処すべきことです。

たとえば、C# から C++ に int 配列を渡すPlatform::Array<int>には、C++/CX ref クラスまたはインターフェイス定義で使用します。このタイプの使用方法の詳細については、MSDN を確認してください。

( http://msdn.microsoft.com/en-us/library/windows/apps/hh700131.aspx )

于 2013-01-21T07:19:55.377 に答える