3

一部のネイティブ C++ コードを C# に公開するラッパーを実装する必要があり、次のチュートリアルに従いました。

http://www.silverlightshow.net/items/Windows-Phone-8-Native-Code-Support.aspx

これまでのところ、私の C# テスト プロジェクトでは、プロジェクト全体(.sln)を参照する限り、ランタイム コンポーネント プロジェクトから C++/CX で記述されたクラスをインスタンス化し、そのクラスのメソッドを使用することに問題はありません。

Visual Studio では、ランタイム コンポーネント DLL だけを参照することはできませんが、プロジェクト内の .winmd ファイルを参照することはできます。その後、C# は名前空間を正しく認識しますが、実行時にTypeLoadException同じオブジェクトを作成しようとするとエラーが発生します。

これは名前空間の問題ではないようです (ここで述べたように: Windows Phone で C++ コンポーネントの名前空間を変更すると例外が発生します)。どういうわけか名前空間に影響しますか?)。

プロジェクト全体を提供する必要なく、エンド ユーザーが参照できる形式でランタイム コンポーネントをバンドルすることは可能ですか?

4

3 に答える 3

1

あなたが見ているのは、ここで説明されている問題の表れだと思います。

つまり、C++ を使用して WinRT コンポーネントを作成する場合、出力 DLL または出力 winmd を参照するだけでは十分ではありません。両方が必要です。

于 2013-08-23T19:26:48.760 に答える
1

に続いて追加する必要がありますWMAppManifest.xml

<ActivatableClasses>
    <InProcessServer>
        <Path>YourComponent.dll</Path>
        <ActivatableClass ThreadingModel="both" ActivatableClassId="YourComponentNamespace.YourComponent"/>
    </InProcessServer>
</ActivatableClasses>

あなたYourComponentのWinMDの名前であること。

于 2013-08-23T19:31:21.633 に答える
1

私はこれと同じ問題を抱えていましたが、(最終的に) .dll と .winmd ファイルが同じ名前 (定義した名前空間と同じ) で、同じディレクトリにある必要があることがわかりました。

たとえば、クラスが X::Y 名前空間にある場合、ファイルは XYdll および XYwinmd である必要があります。

次に、プロジェクトに .winmd ファイルへの参照を追加するだけで済みました (ソリューション エクスプローラーでそのプロジェクトの [参照] フォルダーを右クリックし、[参照の追加...] を選択してから、[参照] を選択します)。表示されるダイアログ)。マニフェスト ファイルに何も追加する必要はありませんでした。

于 2013-09-22T15:10:10.497 に答える