Assembly.GetManifestResourceStream无法在iOS上使用Xamarin

本文关键字:Xamarin iOS GetManifestResourceStream Assembly | 更新日期: 2023-09-27 18:26:50

以下代码在Windows中运行良好,但当使用Xamarin并针对iOS时,GetManifestResourceStream()返回null。

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

我已将文件"DeviceCommon.xsd"设置为嵌入式资源。不确定为什么它没有返回有效的流。

有人知道为什么使用Xamarin在iOS中不起作用吗?

更新:

好的,所以我遵循了评论中的建议,并将文件设置为Content。

我现在可以检测到文件,但无法打开它:

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.

有人知道我该怎么解决这个问题吗???

谢谢,Curtis

Assembly.GetManifestResourceStream无法在iOS上使用Xamarin

好的,我终于开始工作了。在我的例子中,我对windows.dll和Xamarin.iOS.dll使用了相同的文件。我对.dll项目进行了不同的命名,尽管名称空间是相同的。不幸的是,微软的文档说他们使用名称空间作为文件名的一部分。那不是真的。。它们使用.dll名称作为命名空间的一部分。只是一点点的不同,但会带来所有的不同。

所以,说到点子上。。我将文件属性设置为:"嵌入式资源"answers"不复制"。我需要处理的资源都是扩展名为.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);
                }
            }
        }

对我来说,我要做的就是正确地给它加前缀。与其查找"fooBar.baz",不如查找".Name.of.The.Assembly.The.Folder.Inside.fooBar.baz".