2016-05-01 13 views
3

ローズリンを使用して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

contentSystem.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

。アセンブリの内部に作成された再ソースディレクトリはありません。

Resource sample 01

そして、それは、それが現在どのように見えるかです::それは、それがどのように見えるべきかである

Resource sample 02

しかし、どのように私はロズリンを使用してこれらのディレクトリを作成することができますか? [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にも見える:

Resource sample 03

が、メッセージボックス、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のは、いくつかのトラブルになり、他の場合には、名前空間とアセンブリの名前の下にリソースを追加します。第三:幸せになる

ありがとうございました!

+1

なぜあなたの質問に答えを書いたのですか?あなたの質問に答えてください – mohsen

答えて

2

私はこの質問を完全に誤解しているか、正方形の三角形を求めています。

「コンテンツ」と「リソース」の違いは、コンテンツがアセンブリ外に存在し、リソースがアセンブリに埋め込まれていることです。 System.Windows.Application.LoadComponentは、リソースを読み込めません。コンテンツのみを読み込むことができます。

したがって、あなたが求めているのは原則不可能です。

+0

しかし、MSは 'System.Windows.Application.LoadComponent'を' .g.cs'ファイルに埋め込んでいます。しかし、私は 'bin \ debug'や' release'ディレクトリには見たことがありません。したがって、アセンブリの内部からロード可能でなければなりません。 'Roslyn 'と一緒に使うことができる' Page'のような他の 'Build Action'もありますか?大いに感謝する! – BendEg

+0

だから、はい、そうです。これらは、自身の[リソースコンテナ](https://msdn.microsoft.com/en-us/library/zew6azb7(v = vs.90).aspx)であるYourNamespace.g.resourcesとして埋め込まれます。このリソースには、xaml [baml's](https://en.wikipedia.org/wiki/Binary_Application_Markup_Language) –

+0

に感謝してくれました。私は最初の投稿を編集して詳細を追加しました。私は間違ったリソース名を使用していますが、どのように見えるかを理解することはできません。あなたはそこに失敗を見ますか?テスト目的のために、私はxamlとbamlの両方を追加しました – BendEg

関連する問題