2

バックグラウンド

Windows 8(ストアアプリとして)とWindows 7(WPFデスクトップアプリとして)の両方で利用できるアプリを構築しています。これらのアプリでは、大量のコンテンツ(約500以上のアプリケーション「ページ」)を閲覧できます。

私はそれらの間でコードの多くを共有することはできませんが、可能な限り共有したいと思います。そこで、.NET 4.5、Silverlight 4+、およびWindows 8を対象としたポータブルコードライブラリ(PCL)を作成しました。Win8アプリはJavaScriptで記述されているため(さまざまな理由で、この質問の一部ではありません)、Windowsもあります。 JavaScriptとPCLの間のプロキシとして機能するランタイムコンポーネント。つまり、JavaScriptからの非同期呼び出しは、最初にWinRTコンポーネントのメソッドを呼び出し、次にPCLの対応するメソッドを呼び出します。

問題

PCLで非同期操作をサポートするために、NuGetを介してMicrosoft.BclおよびMicrosoft.Bcl.Asyncパッケージをインストールしました。これらは、とりわけ、メソッドを非同期化するために必要なTaskクラスとTask <>クラスを検出しますが、それらは独自のアセンブリで実行します。WinRTコンポーネントには、TaskとTask <>がすでに定義されているため、これらのライブラリは必要ありません。問題は、WinRTコンポーネントにコードを追加して、Task <>オブジェクトを返すPCLのAsyncメソッドを呼び出すと、次のビルドエラーが発生することです。

WINMDEXP:エラーWME1007:参照'Assembly(Name = System.Threading.Tasks、Version = 1.5.11.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a)'を解決できませんでした。

私が試したこと

私はたくさんのことを試しましたが、出てくるかもしれない主な2つは次のとおりです。

  1. WinRTコンポーネントのapp.Configを変更して、アセンブリのbindingRedirectを追加します。
  2. タスクオブジェクトを内部で行う非同期呼び出しから戻し、Wait()を呼び出すことにより、PCL呼び出しを外部で非同期にします。Waitは、不可解な例外をスローするために戻ることはありません。

それで、これを達成する方法について何か考えはありますか?

ありがとう、
デーブ・パーカー

4

2 に答える 2

-1

Windows ランタイム コンポーネントは、JavaScript、C#、および C++ で記述された Windows ストア アプリで使用できる Windows ランタイムのサブセットを対象とする特別な種類のプロジェクトです。
また、すべてのパブリック クラスをシールする、パブリック フィールドがない、Task を返すパブリック メソッドがない、IAsyncAction またはIAsyncOperationのみであるなど、特定のタイプのクラスとプロパティも必要です。制限。

編集: 問題を解決するには、Windows ランタイム コンポーネントで WinRT 以外の型を返してはなりません。ポータブル ライブラリから型を返すことはできません。ラッパー型を作成する必要があります。
また、これらは WinRT 型ではないため、Task および Task 型を返すことはできませんが、ラッパー メソッドを作成して、次のように適切な待機可能な型を返すことができます。

public IAsyncAction DoActionAsync()
{
    return DoAsync().AsAsyncAction();
}

internal async Task DoAsync()
{
}

public IAsyncOperation<int> DoIntOperationAsync()
{
    return DoIntAsync().AsAsyncOperation();
}

internal async Task<int> DoIntAsync()
{
    return 42;
}
于 2012-11-30T19:02:52.557 に答える