@tokumamorioka (森岡 徳馬)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【BUG】Parquet.Net 4.25.0を.NetFramework4.8から正常実行できない

Q&A

Closed

解決したいこと

Parquet.Net 4.25.0の実行時エラーを解決したいです。

発生している問題・エラー

FileNotFoundException: ファイルまたはアセンブリ 'System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

### 該当するソースコード
```C#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658366/acc1ba87-ec83-4091-9986-64df8b77b670.png)


### 再現方法
・.NetFramework4.8※のコンソールプロジェクト作成
・上記画像の通りにコードを作成
・nugetからParquet.Net 4.25.0をインストール
・ParquetSerializer.SerializeAsync()実行時に上記の実行時エラー発生
※.Net環境では再現せずに正常動作
 また、System.Text.Json 8.0.0を手動インストールすることで無理やり正常動作させることも確認済ですが、根本的な解決でないと考えます。

### 備考
Parquet.Netリポジトリに上記内容のissueを作成しました。
https://github.com/aloneguid/parquet-dotnet/issues/601
0 likes

3Answer

.NET Core発なので当たり前っちゃ当たり前.

そもそも.NET Framework対応は謳ってないのでムチャなリクエストはやめましょう.

0Like

Comments

  1. @tokumamorioka

    Questioner

    回答ありがとうございます。

    .NetStandard2.0対応と記載あったので、勝手に.NetFramework対応しているものと勘違いしておりました...。

また、System.Text.Json 8.0.0を手動インストールすることで無理やり正常動作させることも確認済ですが、根本的な解決でないと考えます。

依存関係が解決しているなら、それで問題ないと思います。
ただ、普通はNugetでインストールしていたら依存してるライブラリも勝手にインストールしてくれるんですけど、そうならない理由はよく判りませんが。

.NETStandard 2.0
IronCompress (>= 1.5.2)
Microsoft.Data.Analysis (>= 0.21.1)
Microsoft.IO.RecyclableMemoryStream (>= 3.0.1)
Nullable (>= 1.3.1)
System.Reflection.Emit.Lightweight (>= 4.7.0)
System.Text.Json (>= 8.0.4)
System.Threading.Tasks.Extensions (>= 4.5.4)

これらの中でインストールされていないものがあれば、全部追加で入れる必要があると思います。
Githubで公開されているものなら、適合するフレームワークのものがない場合は
最悪自分でビルドして合わせるなんてことも出来なくはないですが、
.NETの新しいバージョン使えるなら、そちらで使ったほうがいいですね。

0Like

SDK Style にすれば解決しませんでしょうか?

ConsoleApp6.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net481</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <LangVersion>8.0</LangVersion>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Parquet.Net" Version="4.25.0" />
  </ItemGroup>

</Project>
Program.cs
using Parquet.Serialization;
using System;
using System.Collections.Generic;

internal class Program
{
    private static void Main(string[] args)
    {
        ParquetSerializer.SerializeAsync(new List<Record> {
                new Record {
                    Id = 1
                }
            }, "c:\\work\\test.parquet").Wait();

        Console.WriteLine("asdeasd");
        Console.WriteLine("aaa");
    }
    public class Record
    {
        public int Id { get; set; }
    }
}
console output
asdeasd
aaa

C:\Users\***\source\repos\ConsoleApp6\ConsoleApp6\bin\Debug\net481\ConsoleApp6.exe (プロセス 26936) は、コード 0 (0x0) で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...

.NET SDK ベースのプロジェクトを使用している場合は、適切な $(AssetTargetFallback) 値が構成されるため、手動で設定する必要はありません。

https://learn.microsoft.com/ja-jp/nuget/consume-packages/package-references-in-project-files#assettargetfallback

とあるので SDKスタイルでないプロジェクトだと問題になるとかそっちな気もします。

0Like

Your answer might help someone💌