web-dev-qa-db-ja.com

ASP.NETコアMVCプロジェクトから.NET Framework 4.7.2クラスライブラリを参照することは可能ですか?

私はうまく機能するASP.NET MVC 5プロジェクトを持っていて、それはいくつかのCrystalReportsを生成する.NET Framework 4.7.2クラスライブラリを参照しています。 CrystalReportsは.NET COREをサポートしていません。そのため、クラスライブラリはフル.NET Frameworkと一緒にいます。

さて、ASP.NET MVC 5をASP.NETコア2(または3)にアップグレードすると、クラスライブラリを参照してそれらのCrystalReportsを生成することができますか。

5
John

.NET COREは.NET Frameworkライブラリを含めることをサポートしていません。期間。ただし、.NET COREは.NET標準をサポートしており、.NET Frameworkは.NET標準を実装しているため、マイクロソフトはコンパイラで特別な例外を示しました。完全に。 .NET COREプロジェクトに.NET Frameworkライブラリを含めると、この効果に警告が表示されます。これは、ライブラリが正しく終わることを確認するようになります。

.NET Frameworkライブラリの最大の大部分DO.NET Framework固有のAPI(最も重要なWindows固有のAPI)を使用しています。 )。そうすると、彼らはうまくいきません。

ここでは、このライブラリのように見えます( - === - )はWindows固有のAPIを使用します。つまり、.NET COREと互換性がありません。このような状況で、あなたはまだASP.NETコアプロジェクトを作成することはできます必要がありますターゲット.NET Frameworkのではなく、.NETのコア。つまり、ASP.NET CORE 3.0まで.NETフレームワークをターゲットにすることはできません。 ASP.NET CORE 3.0以降は、.NET Frameworkのバージョンがサポートされていない、またはこれまでには、.NET Standard 2.1に依存します。

そのため、100%.NET Standard 2.0準拠ではない.NET Frameworkライブラリを使用する必要がある場合は、.NET Frameworkをターゲットにする必要があります。また、.NET Frameworkをターゲットにする必要がある場合は、ASPの2.2でバージョンロックされています。 .NETコア。

[〜#〜]更新[〜#〜]

この答えは今やちょっと古いですが、まだ役に立つかもしれませんが、私がこのようなものに対処した方法は個人的に非常に小さくて単純なAPIを作成することです。基本的には、ASP.NET CORE 2.1(LTS)アプリを作成します.NET Frameworkをターゲットにして、このアプリは.NET Frameworkライブラリと対話します。ここでレポートの作成を意味します。それから、あなたは空いているあなたは自由にあなたの実際のアプリをapp.netコア3.1以降のアプリとして.Net Coreをターゲットにしていて、あなたが必要なものは何でもデータを取得するためにAPIに電話をかけるだけです。軽量なMicroServiceアプローチのようなものです。

6
Chris Pratt

クリスはすでに優れた正確な答えを提供していますが、私がした実験の結果を共有することでもう少し色を追加しようとします。

実験:私はWebアプリケーションのTargerting .NET Core 3.1をターゲットしています。フルフレームワークをターゲットにするライブラリを呼び出します。そのライブラリでは、.NET CORE 3.1では使用できないフルフレームワークAPIの呼び出しを特別に作成します。この場合、タイプはSHA512Cng

私のライブラリコードは次のとおりです。

        /// <summary>
        /// Returns a base64 encoded Sha512 hash of the text specified.
        /// Uses the SHA512Cng implementation to do the hashing.
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static string Sha512Hash(string text) {

            using (SHA512Cng sha512Cng = new SHA512Cng()) {
                byte[] bytes = Encoding.ASCII.GetBytes(text);
                byte[] hashButes = sha512Cng.ComputeHash(bytes);
                return Convert.ToBase64String(hashButes);
            }
        }
 _

私のWebアプリケーションのホームコントローラで、そのライブラリメソッドを使用することを通話してください。

       public IActionResult Index() {
            string hash = App.Lib.Sha512Hash("hello world");

            return View();
        }
 _

かなり簡単な実験このコードは、フルフレームワークがインストールされているWindowsマシンで実行されています。フルフレームワークをターゲットにしているウェブサイトからこのライブラリを呼び出すと、完全に機能します。

このメソッドを.NET Core 3.1 Webサイトからライブラリで呼び出すと、どうなりますか?それが私がこの実験を答えることを望んだ質問です。

そして答えは...

次の例外をスローします。

System.TypeLoadException: 'Assembly' System.Core、Version = 4.0.0.0、Culture = Neutral、PublicKeykeykon = B77A5C561934J089 '。'。

スクリーンショット:

enter image description here

だからテイクアウトはこれです: それは本当にあなたのコードがフルフレームワークでボックス上で実行されているかどうかは関係ありません。 ASP.NETコア3をターゲットにしているWebサイトからフルフレームワークライブラリを参照し、ASP.NETコア3と互換性がないtypeを参照するメソッドに呼び出してください。投げるのは

2
Ron C