3

新しいプロジェクトを作成するときに、VS2012 によって提供される標準の F# ポータブル ライブラリ オプションを使用して F# ライブラリを作成しました。このライブラリは、C# プログラムで使用することを目的としています。

F# ライブラリは、C# オブジェクトにカプセル化された C# アプリからのデータを受け入れる必要があります。オブジェクトを含む C# dll を F# ライブラリにインポートしましたが、次の 2 つのエラーが発生します。

プライマリ参照 "DataStructures" は、フレームワーク アセンブリ "mscorlib、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089" に間接的な依存関係があるため、解決できませんでした。これは、現在対象となっているフレームワークでは解決できませんでした。".NETPortable,Version=v4.0,Profile=Profile47". この問題を解決するには、参照 "DataStructures" を削除するか、"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" を含むフレームワーク バージョンにアプリケーションを再ターゲットします。

プライマリ参照 "DataStructures" は、フレームワーク アセンブリ "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" に間接的に依存しているため、解決できませんでした。これは、現在対象のフレームワークでは解決できませんでした。".NETPortable,Version=v4.0,Profile=Profile47". この問題を解決するには、参照 "DataStructures" を削除するか、"System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" を含むフレームワーク バージョンにアプリケーションを再ターゲットします。

メッセージを確認すると、F# と C# の dll で使用される と のmscorlib間にバージョンの非互換性の問題があることが明らかです。Systemそこで、単純に F# の参照を、C# dll で使用されている正確な参照に切り替えました。これにより一時的にエラーが解決されましたが、ビルドするとすぐに、f# ライブラリの参照が自動的に以前の「移植可能な」バージョンのmscorlibおよびに戻されましたSystem

これを回避するには、C# アプリにそのデータを強制的に変換させTuple<'t>てから f# dll に送信し、このプロジェクトで C# dll の依存関係を取り除きますが、これらの変換を回避したいと考えていました。

ここに投稿があります ベース CLI ライブラリ 'mscorlib' は、参照されている F# コア ライブラリとバイナリ互換性がありませんpass explicit references to both on the command-line

F# ポータブル ライブラリでこれを行う方法はありますか? または、これらの互換性の問題を解決する他の方法はありますか?

編集:次のことも確認しました:

  1. どちらの dll も .net 4.5 をターゲットにしています
  2. 両方の dll のビルド オプションは、標準の「any cpu」設定に設定されています。
4

1 に答える 1

3

上記の John Palmer のコメントに基づいて、F# ポータブル ライブラリが何に使用されているかを調査しました。

「F# for C# Developers」の Tao Liu によると...

ポータブル クラス ライブラリ プロジェクトは、.NET Framework、Silverlight、.NET for Windows Store アプリ、Windows Phone、および Xbox 360 からのアセンブリのサブセットをサポートし、変更なしで実行されるアセンブリをビルドするために使用できる Visual Studio テンプレートを提供します。これらのプラットフォーム。ポータブル クラス ライブラリ プロジェクトを使用しない場合は、1 つのアプリの種類をターゲットにしてから、他のアプリの種類のクラス ライブラリを手動で作り直す必要があります。ポータブル クラス ライブラリ プロジェクトを使用すると、さまざまなデバイス用のアプリ間で共有されるポータブル アセンブリをビルドすることで、コードの開発とテストにかかる時間とコストを削減できます。

短い答え:基本的にジョン・パーマーが言ったことです。この場合は an を使用しないでくださいF# Portable LibraryF# Library.そうすることで、すべての問題が解決しました。

少し長い答え: WinRT アプリで F# ライブラリを使用する場合、または上記のその他のケースの場合は、この方法が適してF# Portable Libraryいるようです。F# ポータブルは、実際には dll のどこでも一度だけ実行できるようにすることを目的としていますが、それには代償が伴います。すべての依存関係は、System と mscorlib の同じ移植可能なサブセットもターゲットにする必要があります。そのため、使用する C# dllF# Portable Libraryも C# ポータブル クラス ライブラリの形式である必要があります。そうしないと、同じ問題が発生します。

于 2013-08-07T03:34:15.933 に答える