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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

2546閲覧

自作ライブラリの利用時に、ライブラリビルド時に利用したサードパーティライブラリより新しいバージョンを利用したい

nuits.jp

総合スコア346

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

1グッド

0クリップ

投稿2016/12/06 05:02

編集2016/12/06 06:44

###前提・実現したいこと

C#でPrism for Xamarin.Forms向けの外部ライブラリを自作しています。
この時、できるなら以下の二つのバージョンに一つのバイナリで対応したいです。

  • Stable版の6.2.0
  • Preview版の6.3.0-pre1

この為、ライブラリはPrism 6.2.0を利用してビルドし、6.2.0と6.3.0-pre1の双方を利用するアプリから利用できるようにしたいと考えています。
しかし試してみると以下のエラーが発生します。

ところが、6.1.0を利用してビルドしたライブラリは、6.2.0を利用してビルドした利用者側からは問題なく利用できました。

利用者側:6.2.0 ライブラリ側:6.1.0 OK
利用者側:6.3.0-pre1 ライブラリ側:6.2.0 NG

な理由と、あるのであれば対策を教えていただけないでしょうか?
よろしくお願いいたします。

■2016.12.06 15:40追記

PrismのDLLのPublicKeyTokenが違うからのような気がしてきました。
6.1.0と6.2.0はPublicKeyTokenが91a96d2a154366d8ですが
6.3.0-pre1だとPublicKeyTokenが40ee6c3a2184dc59になっています。
つまり以下の認識であっているでしょうか?

  • 6.3.0の今後のバージョンでPublicKeyTokenが6.2.0と同じ値に変更されたらビルドが通るようになる
  • PublicKeyTokenが今後もこのままであれば、ライブラリもバージョン別にビルドする必要がある

2016.12.06 15:40追記終了

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

'BindableBase' は、参照されていないアセンブリに定義されています。アセンブリ 'Prism, Version=6.2.0.0, Culture=neutral, PublicKeyToken=91a96d2a154366d8' に参照を追加する必要があります。

###該当のソースコード

ライブラリ側

cs

1public class DependTo62Class 2{ 3 public void Execute(BindableBase bindableBase) 4 { 5 } 6}

利用側

cs

1public class DependTo63Class : BindableBase 2{ 3 public void Execute() 4 { 5 var target = new DependTo62Class(); 6 target.Execute(this); 7 } 8}

一応Githubにも上げたのでリンクを張っておきます。

https://github.com/nuitsjp/DependencyTest

###試したこと
6.1.0を利用してビルドしたライブラリは、6.2.0を利用してビルドした利用者側からは問題なく利用できました。
またBindableBase自体は、6.2.0~6.3.0-pre1の間では変更は入っていません。
ライブラリの参照プロパティを変更してもダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)

OS:Windows 10 AU
IDE:Visual Studio 2015 Update 3
Prism:6.1.0、6.2.0、6.3.0-pre1

ozwk👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

結論から言うと

6.3.0-pre1はそれ以前と異なる証明書で署名されており、同一の証明書で再署名されないと同じアセンブリとして認識されない。
今後どうなるかは、Prism製作者本人へ問い合わせる必要がある。

ということになりました。

###調査結果

NuGetにアップロードされている全てのアセンブリを調べてみたところ以下の通りとなりました。

Prism.Core.6.3.0-pre1 PublicKeyToken=40ee6c3a2184dc59
Prism.Core.6.2.0 PublicKeyToken=91a96d2a154366d8
Prism.Core.6.2.0-pre1 PublicKeyToken=91a96d2a154366d8
Prism.Core.6.1.0 PublicKeyToken=91a96d2a154366d8
Prism.Core.6.0.1 PublicKeyToken=なし
Prism.Core.6.0.0 PublicKeyToken=なし
Prism.Core.5.7.0-pre3 PublicKeyToken=なし

6.1.0以降は証明書を利用した厳密署名が適用されていて、6.3.0-pre1とそれ以前で証明書が異なっており、結果として違うライブラリとして認識されておりビルドが通らないようです。
Githubに証明書がアップロードされており、それでビルドしたところ6.3.0-pre1と同じPublicKeyTokenとなりました。

つまり、少なくともStableに利用された証明書はどこか別の場所(おそらく本人のみ所持)にあるのだと思います。
多分モジュールの改ざん検知などのセキュリティ強化の一端と想定されますが、なぜ6.3.0-pre1が異なる証明書で署名されているのかは、製作者サイドへの問い合わせが必要そうです。

投稿2016/12/06 07:23

nuits.jp

総合スコア346

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

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

nuits.jp

2016/12/06 15:36

開発者本人に質問してみました。 結果からいうと、6.3.0は破壊的変更が含まれる為、証明書が変わって古いバージョンを参照して作成されたサードパーティライブラリがビルドできなくなることは、好ましいと考えているということだそうです。 一応やり取りはこちらにログが残っています。 https://twitter.com/nuits_jp/status/806116109468303361
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問