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

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

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

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

Visual Studio

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

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

Q&A

解決済

4回答

2448閲覧

C#で別のプロジェクトの画像ファイルを参照する方法

yrema

総合スコア286

C#

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

Visual Studio

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

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

0グッド

0クリップ

投稿2019/07/03 02:33

編集2019/07/03 03:35

XamarinでiOSアプリを作っています。
メインのプロジェクトAから共有プロジェクトBにある画像リソースを参照する方法はあるでしょうか?

Bの直下
Imagesディレクトリ内
- 1.png
- 2.png

Aから下記のようにしてもnullになってしまいます(恐らく自分のプロジェクトを見に行っている)

c#

1UIImage image = UIImage.FromFile("Images/1.png"); // nullになってしまう

Xamarin.iOSですが、VisualStudioやC#寄りの質問かなと思ってタグに追記しています。

◆目的
・Xamarin.iOSのプロジェクトとWindowsFormのプロジェクトから共通プロジェクト内にある画像を読み込みたい。
・画像はファイル実体にアクセスではなくResources内にある埋め込みされたファイルアクセスのように扱いたい。

◆環境
Visual Studio 2019
Xamarin 16.1
Xamarin.iOS 12.10
実機iPadのiOS 12.3

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

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

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

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

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

guest

回答4

0

ちょうど今書いていたので私の実装をさらします。

C#

1public sealed class Images 2{ 3 /// <summary> 4 /// 埋め込みリソースからBitmapImageを取得 5 /// </summary> 6 /// <param name="resourceName">埋め込みリソース名</param> 7 /// <param name="nameSpace">名前空間</param> 8 /// <returns></returns> 9 private static BitmapImage GetBitmapImage(string resourceName, 10 string nameSpace = "Hogehoge.Infrastructures.Images") 11 { 12 var image = new BitmapImage(); 13 14 image.BeginInit(); 15 image.StreamSource = Assy.GetManifestResourceStream($"{nameSpace}.{resourceName}"); 16 image.CacheOption = BitmapCacheOption.OnLoad; 17 image.EndInit(); 18 19 return image; 20 } 21 22 private static Assembly Assy { get; } = 23 Assembly.GetExecutingAssembly(); 24 25 public static BitmapImage Order { get; } = 26 GetBitmapImage("order128.png"); 27 28 public static BitmapImage Production { get; } = 29 GetBitmapImage("production128.png"); 30 31 public static BitmapImage Shipment { get; } = 32 GetBitmapImage("shipment128.png"); 33 34 public static BitmapImage Receipt { get; } = 35 GetBitmapImage("receipt128.png"); 36 37 public static BitmapImage Return { get; } = 38 GetBitmapImage("return128.png"); 39 40 public static BitmapImage Sale { get; } = 41 GetBitmapImage("sale128.png"); 42 43 public static BitmapImage Invoice { get; } = 44 GetBitmapImage("invoice128.png"); 45 46 public static BitmapImage Payment { get; } = 47 GetBitmapImage("payment128.png"); 48}

投稿2019/07/04 01:29

hihijiji

総合スコア4150

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

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

yrema

2019/07/04 03:52

ありがとうございます。参考になります。amay077さんの方が投稿が早かったのでそちらをベストアンサーにさせていただきました。
guest

0

ベストアンサー

試しにプロジェクト作ってみました。

https://github.com/amay077/ImageRefSample

共有プロジェクトが ImageRefSample という名前で、その中に myprof.png埋め込みリソース として追加されているという前提で、アプリ側のコードは次のようになります。

csharp

1// 他のプロジェクトにある型からアセンブリを取得 2var assembly = typeof(MyClass).GetTypeInfo().Assembly; 3 4// 一応埋め込みリソースをリストアップ 5foreach (var res in assembly.GetManifestResourceNames()) 6{ 7 System.Diagnostics.Debug.WriteLine("found resource: " + res); 8} 9 10// ImageRefSample プロジェクトの myprof.png を読み込み 11using (var stream = assembly.GetManifestResourceStream("ImageRefSample.myprof.png")) 12{ 13 var imageData = Foundation.NSData.FromStream(stream); 14 var image = UIImage.LoadFromData(imageData); 15 16 image1.Image = image; 17}

端的に言えば、

typeof(<共有プロジェクトにあるクラス>).GetTypeInfo().Assembly.GetManifestResourceStream("<共有プロジェクト名.画像ファイル名>")

で、画像データを Stream として読み出せるので、後はプラットフォーム側でよしなに利用するだけです。

投稿2019/07/03 07:54

amay077

総合スコア1075

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

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

yrema

2019/07/04 03:51

ありがとうございます!解決できました!
guest

0

共有プロジェクトBの画像のプロパティに定義されているビルドアクションを「埋め込まれたリソース」に変えて、そこのリソースにプロジェクトAがアクセスするという手段はいかがでしょうか。

デバッグはしていませんが、イメージとしては下記のようなコードです。

C#

1var projectBAssembly = AppDomain.CurrentDomain.GetAssemblies(). 2 SingleOrDefault(assembly => assembly.GetName().Name == "プロジェクトB"); 3var stream = projectBAssembly.GetManifestResourceStream("Images/1.png"); 4var imageData = NSData.FromStream(stream); 5 6UIImage image = UIImage.LoadFromData(imageData);

参考:
https://dobon.net/vb/dotnet/programing/bitmapresource.html
https://stackoverflow.com/questions/43995539/how-to-convert-stream-to-uiimage-in-xamarin-ios

追記:
参考URLにもありますが、streamimageDataimageなどはIDisposableなオブジェクトなのでusingを使うか明示的にDisposeメソッドを呼んでリソースの破棄を忘れないようにしてください。

投稿2019/07/03 03:34

編集2019/07/03 06:21
BluOxy

総合スコア2663

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

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

yrema

2019/07/03 04:15 編集

共有プロジェクトのAssemblyが取得できないようです。 AppDomain.CurrentDomain.GetAssemblies()の中身をforeachで出力してみましたが、以下の5つしかありませんでした。  mscorlib  Xamarin.iOS  System  メインプロジェクトA  System.Core
BluOxy

2019/07/03 04:15

プロジェクトA側でプロジェクトBの参照設定は行われましたか
yrema

2019/07/03 04:16

プロジェクトA側でプロジェクトBのクラスは使えるので参照設定されてると思われます。
Zuishin

2019/07/03 04:22

共有プロジェクトを参照しただけで中のクラスを使ってないからロードされてないということだと思います。プロジェクト間の依存関係をソリューションエクスプローラから設定し、共有プロジェクトの出力をそれを使いたいプロジェクトの出力パスにビルドイベントなどでコピーし、ファイル名を指定して明示的にロードすれば後はこの方法でできるのではないでしょうか。
BluOxy

2019/07/03 04:38 編集

補足ありがとうございます。 Zuishinさんの仰る通り明示的に名前を指定してロードするか、もしくは恐らくですがAssembly.GetReferencedAssemblies()を利用して(ロードしているか否かに関わらず)プロジェクトAが参照しているアセンブリを取得することも出来るかと思います。
yrema

2019/07/03 04:45 編集

共有プロジェクトで[プロジェクト]→[プロパティ]を開くと「選択範囲にプロパティページはありません」とポップアップされ、出力パスやビルドイベントの入力欄が開きませんでした。 Assembly.GetReferencedAssemblies()は以下の4つだけで、共有プロジェクトは中に入っていませんでした。  mscorlib  Xamarin.iOS  System  System.Core
guest

0

フルパスで指定してやればいいのでは。

投稿2019/07/03 02:35

y_waiwai

総合スコア87804

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

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

yrema

2019/07/03 02:38

他のプロジェクトのフルパスを取得する方法はありますか?
y_waiwai

2019/07/03 02:41

その、他のプロジェクトの場所がわかればわかりますわな
amay077

2019/07/03 03:07

「共有プロジェクトBの画像が、アプリ配下のどこかのディレクトリに在る」と想定しているなら、アプリを iOS Simulator で動かすと、 /Users/<ユーザー名>/Library/Developer/CoreSimulator/Devices/<アプリのUUID> にアプリが展開されるので、その中で画像ファイルの所在を確認してみると良いと思います。
yrema

2019/07/03 03:12

私の認識が間違っているかもしれませんが、実行時には画像ファイルが埋め込まれている気がするのですが、メインプロジェクトのResourcesと同様な使い方をしたいのです。
y_waiwai

2019/07/03 03:17

ならそのリソースファイルの場所を特定して、リソースの読み込みを行うってことになると思いますが、 わざわざそんな面倒なことをせずとも、その画像ファイルをこちらに取り込めばどうですか
y_waiwai

2019/07/03 03:20

他のプロジェクトの、というから開発時だと思ってたけど、実行時のはなしですか。 IOS上ではムリだとおもいますよ。。
yrema

2019/07/03 03:28

Xamarin.iOSのプロジェクトとWindowsFromのプロジェクトから共有プロジェクト内の同じ画像を使いたかったのですが、個別のプロジェクトに入れるしかないということなのでしょうか。。
y_waiwai

2019/07/03 03:30

えーと、話がまるっきり変わってしまってるようなんで、そこらへんの事情を質問を編集して質問に追記しましょう #なんのはなしやよーわからんw
yrema

2019/07/03 03:36

すみません、質問を修正しました。
y_waiwai

2019/07/03 03:39

その読み込みたいリソースファイルの場所を特定して、リソースファイルを読み込み、そのリソースの画像を読み込めばいいというはなしですが、そんではダメですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問