ローズリンを使用してcontent
を組み立てることは可能ですか?埋め込みリソースは素晴らしいですが、コンテンツを追加する方法を理解することはできません。Roslynはアセンブリに内容を埋め込みます
foreach (string file in Directory.GetFiles(inputPath).Where(item => item.EndsWith(".xaml")))
{
var resourceDescription = new ResourceDescription(
Path.GetFileName(file.ToLower()),
() => File.OpenRead(file.ToLower()),
true);
resourceDescriptions.Add(resourceDescription);
}
よりも発光ときにそれを渡します:私はこのようなリソースを追加
EmitResult result = compilation.Emit(ms, manifestResources: resourceDescriptions.ToArray());
しかし、私はBuild Actions
の他のタイプを追加することになりましません。
EDIT
はcontent
はSystem.Windows.Application.LoadComponent(this, resourceLocater);
を使用してロード可能でなければなりません。
EDIT 2
[OK]を、テストの目的のために、私は、の.xamlと.bamlの両方を追加し、私はまだtestusercontrol.xaml
が見つからなかったことを示すメッセージ、 を取得します。
List<ResourceDescription> resourceDescriptions = new List<ResourceDescription>();
foreach (string file in Directory.GetFiles(outputPath).Where(item => item.EndsWith(".baml")))
{
var resourceDescription = new ResourceDescription(
string.Format("{0}.g.{1}", RootNamespace, Path.GetFileName(file.ToLower())),
Path.GetFileName(file.ToLower()),
() => File.OpenRead(file.ToLower()),
true);
resourceDescriptions.Add(resourceDescription);
}
foreach (string file in Directory.GetFiles(inputPath).Where(item => item.EndsWith(".xaml")))
{
var resourceDescription = new ResourceDescription(
string.Format("{0}.g.{1}", RootNamespace, Path.GetFileName(file.ToLower())),
Path.GetFileName(file.ToLower()),
() => File.OpenRead(file.ToLower()),
true);
resourceDescriptions.Add(resourceDescription);
}
EmitResult result = compilation.Emit(ms, manifestResources: resourceDescriptions.ToArray());
は私が間違ってressourceName
を使用しています(編集3で、これはそうでなければなりません):ここでは
は、私はそれらのファイルを追加している方法ですか?私はいただきました!間違ってしまったと思います
EDIT 3
。アセンブリの内部に作成された再ソースディレクトリはありません。
そして、それは、それが現在どのように見えるかです::それは、それがどのように見えるべきかである
しかし、どのように私はロズリンを使用してこれらのディレクトリを作成することができますか? [OK]を
EDIT 4
、リソースを埋め込むことは、次のコードで動作し:
string resourcePath = string.Format("{0}{1}.g.resources", outputPath, RootNamespace);
ResourceWriter rsWriter = new ResourceWriter(resourcePath);
foreach (string file in Directory.GetFiles(outputPath).Where(item => item.EndsWith(".baml")))
{
var fileName = Path.GetFileName(file.ToLower());
var data = File.ReadAllBytes(file);
rsWriter.AddResource(fileName, data);
}
foreach (string file in Directory.GetFiles(inputPath).Where(item => item.EndsWith(".xaml")))
{
var fileName = Path.GetFileName(file.ToLower());
var data = File.ReadAllBytes(file);
rsWriter.AddResource(fileName, data);
}
rsWriter.Generate();
rsWriter.Close();
var resourceDescription = new ResourceDescription(
string.Format("{0}.g.resources", RootNamespace),
() => File.OpenRead(resourcePath),
true);
resourceDescriptions.Add(resourceDescription);
EmitResult result = compilation.Emit(ms, manifestResources: resourceDescriptions.ToArray());
はILSpy
にも見える:
が、メッセージボックス、testusercontrol.xaml
がまだ見つかりませんでした。私は何が間違っていますか?
EDIT 5 - SOLUTION
それが動作するようになりました!手順:
まず:
// Add ressource under the namespace AND assembly
var resourceDescription = new ResourceDescription(
string.Format("{0}.g.resources", RootNamespace),
() => File.OpenRead(resourcePath),
true);
resourceDescriptions.Add(resourceDescription);
if (RootNamespace != assemblyName)
{
resourceDescription = new ResourceDescription(
string.Format("{0}.g.resources", assemblyName),
() => File.OpenRead(resourcePath),
true);
resourceDescriptions.Add(resourceDescription);
}
第二:ストリームなどのリソースを追加します。
foreach (string file in Directory.GetFiles(outputPath).Where(item => item.EndsWith(".baml")))
{
var fileName = Path.GetFileName(file.ToLower());
var data = File.OpenRead(file);
rsWriter.AddResource(fileName, data, true);
}
Roslynのは、いくつかのトラブルになり、他の場合には、名前空間とアセンブリの名前の下にリソースを追加します。第三:幸せになる
ありがとうございました!
なぜあなたの質問に答えを書いたのですか?あなたの質問に答えてください – mohsen