如何获取嵌入式资源的资源Uri?

3
如何获取嵌入资源的资源Uri?
我有一个如下所示的方法,用于验证xml与xsd文件是否匹配。这个方法在MSTest中使用:
     public static string Validate(string xml, string relativeXsdFilePath)
            {
                var schemas = new XmlSchemaSet();

// relativeXsdFilePath like 'TestData.Xsd.XsdFile1.xsd'
                var schemaUri = ResourceHelper.GetPath(relativeXsdFilePath);

                schemas.Add("", schemaUri);

                XDocument doc = XDocument.Load(new StringReader(xml));
                string msg = null;
                doc.Validate(schemas, (o, e) =>
                {
                    msg = e.Message;
                });
                return msg;
            }

我正在尝试实现以下方法,但是迄今为止没有成功:

    public static string GetPath(string relativeFileName)
    {
        var assemblyName = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Name;

         var resourceName = GetResourceName(relativeFileName);

// resource name would be like 'ProjectName.UnitTests.TestData.Xsd.profile.xsd'
        var result = string.Format("/{0};component/{1}", assemblyName, resourceName);

        return result;
    }

我的XSD文件位于这里:

ProjectRoot
---TestData
------Xsd
---------XsdFile1.xsd
2个回答

3

我意识到它也接受XmlReader,如果有人遇到同样的问题,这是我的解决方案:

 public static XmlReader LoadAsXmlReader(string relativeFileName)
        {
            var result = LoadAsStream(relativeFileName);

            var xmlReader = new XmlTextReader(result);

            return xmlReader;
        }

        private static Stream LoadAsStream(string relativeFileName)
        {
            var resourceFileName = Assembly
                .GetExecutingAssembly()
                .GetManifestResourceNames()
                .FirstOrDefault(p => p.EndsWith(relativeFileName));


            return Assembly
                .GetExecutingAssembly()
                .GetManifestResourceStream(resourceFileName);
        }

引用MSDN的话:“在.NET Framework 2.0版本中,推荐使用XmlReader.Create方法创建XmlReader实例。这样可以充分利用此版本引入的新功能。有关更多信息,请参见创建XML读取器。” - 链接 - Petru Gardea

2

作为一个快速简单的解决方案:

public static string GetPath(string relativeFileName)
{
    return Assembly.GetExecutingAssembly().GetManifestResourceNames().FirstOrDefault(x => x.EndsWith(relativeFileName));
}

3
谢谢,但那只会返回资源名称。无法仅将名称添加到schemas.Add()集合中,它需要完整路径。 - The Light

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接