4

次のコードは Windows では問題なく動作しますが、Xamarin を使用して iOS をターゲットにしている場合、GetManifestResourceStream() は null を返します。

Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream("CommunicationModel.XmlSchemas.DeviceCommon.xsd");

ファイル 'DeviceCommon.xsd' を埋め込みリソースとして設定しました。有効なストリームを返さない理由がわかりません。

Xamarin を使用して iOS でこれが機能しない理由を知っている人はいますか?

アップデート:

わかりましたので、コメントのアドバイスに従い、ファイルをコンテンツに設定しました。

ファイルを検出できるようになりましたが、開くことができません:

if (File.Exists("DeviceCommon.xsd"))
{
  try
  {
    myStream = new FileStream("DeviceCommon.xsd", FileMode.Open);
  }
....
}

上記のコードを実行すると、「File.Exists()」呼び出しは機能しますが、開こうとすると次の例外が発生します。

Access to the path "/private/var/mobile/Applications/8BD48D1F-F8E8-4A80-A446-F807C6728805/UpnpUI_iOS.app/DeviceCommon.xsd" is denied.

どうすればこれを修正できるか、誰にもアイデアがありますか???

ありがとう、カーティス

4

2 に答える 2

4

わかりました、私はついにそれを働かせました。私の場合、Windows .dll と Xamarin.iOS.dll に同じファイルを使用していました。名前空間は同じですが、.dll プロジェクトに別の名前を付けました。残念ながら、マイクロソフトのドキュメントによると、名前空間をファイル名の一部として使用しています。それは真実ではありません..名前空間の一部として .dll 名を使用します。ほんのわずかな違いですが、すべての違いを生み出します。

要するに..ファイルのプロパティを「埋め込みリソース」と「コピーしない」に設定しました。処理する必要のあるリソースはすべて拡張子が .xsd のファイルだったので、すべてのリソース名をループして、末尾が .xsd のものを使用しました。このようにすると、どのオペレーティング システムを使用していても、名前はプログラムで取得し、ハード コーディングしていないため、正しい名前になります。

        Assembly assembly = Assembly.GetExecutingAssembly();
        string[] resources = assembly.GetManifestResourceNames();
        foreach (string resource in resources)
        {
            if(resource.EndsWith(".xsd"))
            {
                Stream stream = assembly.GetManifestResourceStream(resource);
                if (stream != null)
                {
                    XmlSchema schema = XmlSchema.Read(stream, null);
                    _schemas.Add(schema);
                }
            }
        }
于 2013-08-23T14:16:44.873 に答える
4

私がしなければならなかったことは、適切に接頭辞を付けることです。「fooBar.baz」を探す代わりに、「The.Name.Of.The.Assembly.The.Folder.Inside.fooBar.baz」を探します。

于 2018-03-15T06:55:27.177 に答える