2009-07-10 7 views
7

特定のリソースファイル(「Script.xml」という名前)が埋め込まれたコンパイル済み.NETアセンブリがあります。私はプログラム的に別のものに変更する必要があります。.NETアセンブリにリソースをプログラムで埋め込みます。

ソースから再コンパイルせずにこれを行うことはできますか?

現在、私はファイル内にあることを知っているテキストを検索し、うまくいきます。しかし、私はリソースファイルの内容を知らない別のプロジェクトでそれを行う必要があり、別の方法を見つける必要があります。

FileStream exe = new FileStream(currentexe, FileMode.Open); 

//find xml part of exefile 
string find = "<?xml version=\"1.0\"?>"; 
string lastchars = new string(' ', find.Length); 
while (exe.CanRead) { 
    lastchars = lastchars.Substring(1) + (char)exe.ReadByte(); 
    if (lastchars == find) { 
     exe.Seek(-find.Length, SeekOrigin.Current); 
     break; 
    } 
} 

//output serialized script 
int bytenum = 0; 
foreach (byte c in xml) { 
    if (c == 0) break; 
    exe.WriteByte(c); 
    bytenum++; 
} 

//clean out extra data 
while (bytenum++ < ScriptFileSize) { 
    exe.WriteByte(0x20); 
} 
exe.Close(); 

答えて

4

Cecilを使ってアセンブリを開き、リソースを挿入することができます。 YMMV

+1

Cecilを使用してPDBを正しく読み込んで再生成すると、PDBが破損することはありません。 –

+0

私はこれが当てはまると思っていましたが、1.5年前に私はそれをする方法を理解できませんでした。例がありますか? –

+0

それはすでに元気でした。しかし、最近では、あなたが好きにしたいと思う新しいAPIをここに示します:https://github.com/jbevain/cecil/wiki/Debug-symbols –

4

あなたの現在のメカニズムは非常に壊れやすいです - それは、署名付きのアセンブリのために動作しません(ハッシュが変更されますように)か、(他のすべてのオフセットは移動してもよいと)大きなものにつのリソースを交換する必要がある場合。また、文字エンコーディングやファイルの正しい点を見つけるための一般的なメカニズムに関しても問題はありますが、アプローチが適切ではないと考えると、それは比較的重要ではありません。

交換可能なリソースが必要な場合は、アセンブリの比較的繊細なフォーマットを持たない別のファイルに置きます。

+0

リソースファイルは大きくなる可能性があります。スペースファイル(最大サイズ: 'ScriptFileSize'まで)を埋め込むことができるため、リソースファイルはさらに大きくなります。残念なことに、このプロジェクトでは1つのファイルに含める必要があります。 –

+0

@Nick:これは、既存のリソースが常にScriptFileSizeになるため、既存のリソースより大きくすることはできません。私は本当に、これを再設計しようとします。絶対に行う必要がある場合は、アセンブリファイル形式(Cecil - http://www.mono-project.com/Cecilのような)を知っているライブラリを使用してください。ただし可能な限り、それを避けてください。 –

+0

@Jon:実際には、アセンブリはもともとconst ScriptFileSizeと一致するようにすでにそこに埋め込まれています。私は十分なスペースを与え、決してそれを使い果たしたことはなく、これは現在何百ものコンピュータ上で正常に動作しています。しかし、私は本当に、本当に、それを再設計したいのですが、なぜここに投稿しているのですか? –

1

アセンブリを動的にコンパイルするには、おそらくSystem.Runtime.Emitが必要です。

1

リフレクション、具体的にはAssemblyBuilderクラスを使用してアセンブリを動的に構築し、動的に組み立てられたアセンブリにリソースを組み込むことができます。私はリフレクションを使って既存のアセンブリを分解することが可能かどうかはわかりません(今は興味がありますが)。

可能であれば、別のツリーを樹立します。