質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

4983閲覧

Nugetライブラリに依存したアプリの配布方法

Chikage_Haruse

総合スコア14

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/07/19 15:24

編集2021/07/20 07:14

前提・実現したいこと

Nugetのライブラリに依存したアプリを初めて作ったのですが、配布の方法がわかりません。
環境はVisual Studio 2019、作ったアプリはVB.NETのwindowsフォームアプリケーションです。

発生している問題・エラーメッセージ

これまではリリースチャンネルでビルドしたexeをそのまま渡していたのですが、今回それをすると起動しなくなりました。
具体的には、コピーしたアプリを起動して特定の操作をすると下の画像のエラーが出ます。
エラー画像
なおデバッグではうまく動作したのでアプリ自体の問題ではありません。

試したこと

Releaseフォルダの中に入っていたファイルをすべて(dll,xml,exe)別のフォルダに移し替えて起動してみましたが、結果は変わらずでした。
なおファイル名しか見ていませんが、依存しているファイルに欠落がないことを確認しています。
その後移し替えずにReleaseフォルダの中のexeをそのまま起動しましたが、同じようにエラーが出ました。
なおローカルフォルダに発行をしたところ、autorun.infが弾かれるエラーで発行ができませんでした。

どなたかご教授いただければ幸いです。

追記
自己解決のほうでいくつかご指摘をいただいたので、exe.configの中身も載せます。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> 5 </startup> 6 <runtime> 7 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 8 <dependentAssembly> 9 <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 10 <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> 11 </dependentAssembly> 12 </assemblyBinding> 13 </runtime> 14</configuration>

さらに追記
いよいよバージョン関係が自分でもよくわからなくなったので、プロジェクトファイルをまるまる見ていただきたいです。
GitHubに上げてあります。→GitHub
ご指摘でNewtonsoft.Jsonが12.0であるという指摘をいただきましたが、自分で確認する限りすべて13.0.xでそろえてあるはずなのです。
どこで間違えたのか、今後のためにもご指南いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/07/19 16:11

Newtonsoft.Json.dllが存在してるか確認したんだろうか? あとフォルダに「発行」してみてその中身を全部コピーしてみるとか。
Chikage_Haruse

2021/07/19 16:15

Newtonsoft.Json.dllは同じフォルダ内にあります。 発行をした場合、「autorun.inf」にアクセスできない内容のエラーがでてしまいます。
退会済みユーザー

退会済みユーザー

2021/07/19 22:14

> Newtonsoft.Json.dllは同じフォルダ内にあります。 その「フォルダ」とは何ですか? 発行した exe ファイルがあるフォルダと同じフォルダ?
退会済みユーザー

退会済みユーザー

2021/07/20 07:50 編集

試しにgithubのファイルをビルドして、YoutubeLiveChatTranslater.exe.configをデリートして実行し、設定というフォームが起動するのを確認しました。特に問題は無さそうに見えますが… そのまま渡していた、と書いてあるという事は、自PC以外という事ですかね?相手先に古いファイルが残っていたりとかのパターンは無いですかね? 中間ファイルフォルダ、Releaseフォルダのファイルも一度クリーンアップしてビルドしてみた方がいいかもしれません。
Chikage_Haruse

2021/07/20 08:02

起動はできますが、翻訳ウィンドウを表示したときにエラーを吐きます。なおapiキーやライブidをちゃんと指定しないと、エラー処理をまだ実装していないので別の原因で止まります。 使い方はリリースのzipの中にreadmeが入っているので、そちらを参照していただきたいです。 >そのまま渡していた、と書いてあるという事は、自PC以外という事ですかね? 手元に開発用PCと趣味用PCの2機あり、開発用から趣味用に移すとこのようになります。 ちなみに開発用PCで検証しても同じ結果になるので、原因は環境依存ではないと思いす。
guest

回答2

0

ベストアンサー

追記のconfigを確認しましたが、エラーメッセージの依存バージョンが12.0.0.0で、bindingRedirectで13.0.0.0と記述されているので、配置したdllのバージョンと一致していなかったりしませんか?
一度参照しているdllのバージョンを見直してみてはいかがでしょう。


githubからソースをDLして実行し、例外を再現しました。
原因は Google.Apis の参照ですね。エラーを貼るときは、メッセージとスタックトレースも含めて貼りましょう。
また、今回のように想定外のdllが関係している場合もあるので、同時に使用しているライブラリも記載するようにしましょう。

C#

1System.InvalidOperationException: フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。 エラー:ファイルまたはアセンブリ 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040) ---> System.IO.FileLoadException: ファイルまたはアセンブリ 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040) 2 場所 Google.Apis.Json.NewtonsoftJsonSerializer..ctor() 3 場所 Google.Apis.Services.BaseClientService.Initializer..ctor() 4 場所 Youtube_Live_Chat_Translater.Chat..ctor() 5 --- 内部例外スタック トレースの終わり --- 6 場所 Youtube_Live_Chat_Translater.My.MyProject.MyForms.Create__Instance__[T](T Instance) 7 場所 Youtube_Live_Chat_Translater.Main.Show_chat_window(Object sender, EventArgs e) 8 場所 System.Windows.Forms.Control.OnClick(EventArgs e) 9 場所 System.Windows.Forms.Button.OnClick(EventArgs e) 10 場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 11 場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 12 場所 System.Windows.Forms.Control.WndProc(Message& m) 13 場所 System.Windows.Forms.ButtonBase.WndProc(Message& m) 14 場所 System.Windows.Forms.Button.WndProc(Message& m) 15 場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 16 場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 17 場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

ILSpyでGoogle.Apis.dllのReferencesを確認すると、こうなっています。

cs

1// Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed

bindingRedirectは、多分Google.Apisの方が参照を解決しようとして追加されたのでしょう。exe.configも一緒に配布で問題ないと思います。

投稿2021/07/20 07:03

編集2021/07/20 08:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chikage_Haruse

2021/07/20 08:38 編集

ご回答ありがとうございます。 無知な質問で申し訳ないのですが、スタックトレースの見方はどうすればいいのでしょうか。 VSからでなくても見れるのでしょうか。 申し訳ありませんが、ご教授いただきたいです。 また、現実的な解決方法としては、Newtonsoft.Jsonのバージョンを下げてビルドしなおすという方法でよいでしょうか。
退会済みユーザー

退会済みユーザー

2021/07/20 08:41 編集

スタックトレースは、直前に実行していたメソッドの呼び出し履歴です。例外ダイアログの左下の詳細ボタンを押すと表示されます。今回のスタックトレースを確認すると、最後に Google.Apis.Json.NewtonsoftJsonSerializer..ctor() が呼び出されているのが判るので、ここが原因だと判りますね。 exe.configで解決するのが気持ち悪いのであればバージョンを下げてもいいですし、別にexe.configで解決してもいいと思います。
退会済みユーザー

退会済みユーザー

2021/07/20 09:09

あ、でもメジャーバージョンまで違うと破壊的変更があるライブラリも多いので、互換性を気にするのであればバージョンを合わせた方が無難かもしれません。
guest

0

利用しているファイル管理システムで、必要なファイルを指定し忘れていました。
指定し忘れていたファイルは(バイナリの名前).exe.configでした。これがないとdllがうまく読み込めないようです。
お騒がせしました。

投稿2021/07/20 03:05

Chikage_Haruse

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/20 05:57

ホントですかね? Newtonsoft.Json.dll を使うなら、それが .exe ファイルと同じフォルダにあるだけで良いはずで、.exe.config にそんな情報は不要と思うのですが。
Chikage_Haruse

2021/07/20 06:26

正常に動くことを確認したのち、*.exe.configをほかのフォルダに移動させて起動させたところ、エラーの再現に成功しました。 なのでほぼ間違いなくexe.configによるものだと思われます。
退会済みユーザー

退会済みユーザー

2021/07/20 06:30 編集

エラーメッセージから見るに、開発時に参照していたdllのバージョンと配置されたdllのバージョンが違っていて、それが.exe.configファイルのbindingRedirectで解消されて起動するようになったとかそんな感じかなと推定します。一応回答に.exe.configの中身も追記しておいて貰えますか?
Chikage_Haruse

2021/07/20 06:36

そうすると、これはきれいな直し方じゃなかった可能性がありますね… 一旦未解決に戻して、質問のほうにexe.configの中身を追記します。
退会済みユーザー

退会済みユーザー

2021/07/20 06:40

bindingRedirectは解決法の一つではありますが、一旦使ってる参照を削除して正しいバージョンを参照してビルドする、参照したバージョンのdllを配布する、とすれば問題なく動きそうな気はします。
退会済みユーザー

退会済みユーザー

2021/07/20 06:52

そもそも何をして config ファイルにそういう設定がされたのでしょう? Newtonsoft.json を Nuget からインストールするだけでは config ファイルには Newtonsoft 関係の設定はされない(もともとあったはずの supportedRuntime の設定だけ)と思うのですが。
Chikage_Haruse

2021/07/20 07:02

NugetのGUIでNewtonsoft.jsonの安定板(13.0.1)をインストールして、その後必要だったのでGoogle.Apis.YouTube.v3をインストールしました。特にほかの設定とかはいじっていないはずです。 なぜYouTube Apiのほうはコンフィグファイルに書かれていないのか見当もつきません。 またうっかり設定などを触ってしまった可能性もありますが、今のところはわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問