如何將程序集保存到文件?即我的意思不是動態組裝,而是「正常」的內存組件。如何將程序集保存到磁盤?
Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ass1 in asslist)
{
// How to save?
}
當應用程序從資源加載一些引用的程序集時,可能會出現這種情況。我想將它們保存到磁盤。
由於它們在那裏被加密,所以不可能提取程序集表單資源。
如何將程序集保存到文件?即我的意思不是動態組裝,而是「正常」的內存組件。如何將程序集保存到磁盤?
Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ass1 in asslist)
{
// How to save?
}
當應用程序從資源加載一些引用的程序集時,可能會出現這種情況。我想將它們保存到磁盤。
由於它們在那裏被加密,所以不可能提取程序集表單資源。
您需要找到您的ass[...]es
來自的路徑。您可以這樣找到它:
Assembly ass = ...;
return ass.Location;
通知書的,as
是一個關鍵字,不能用作標識符。我建議使用ass
。
我無法找到路徑,因爲tehse程序集已加密並處於資源中。應用程序將它們加載到「解決事件」上。屬性'位置'由於包含不可打印的字符而不可讀取 – Oleg
從格雷格羅斯的想法我開發了這個小片段。 請注意,我試圖堅持命名約定。
public void SaveAllAssemblies()
{
Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ass in asslist)
{
FileInfo fi = new FileInfo(ass.Location);
if (!fi.Extension.Equals(".exe", StringComparison.InvariantCultureIgnoreCase))
{
var assName = fi.Name;
var assConverter = new FormatterConverter();
var assInfo = new SerializationInfo(typeof(Assembly), assConverter);
var assContext = new StreamingContext();
using (var assStream = new FileStream(assName, FileMode.Create))
{
BinaryFormatter bformatter = new BinaryFormatter();
ass.GetObjectData(assInfo, assContext);
bformatter.Serialize(assStream, assInfo);
assStream.Close();
}
}
}
}
但是一些程序集沒有標記爲可序列化,例如mscorlib.dll。 因此,這可能只是一個部分解決方案?
儘管有可能連載一些組件,我建議使用 的FileInfo作爲例子提供,生成列表,並檢查原 組件。
我在我的測試應用程序(exe和我的程序集)中試過這種方式。我試圖序列化我的程序集。 mscorlib,版本= 4.0.0.0,Culture = neutral,PublicKeyToken ='中的bformatter.Serialize()調用:[System.Runtime.Serialization.SerializationException] = {「Type'System.Runtime.Serialization.SerializationInfo' b77a5c561934e089'未標記爲可序列化。「} – Oleg
正如代碼示例中的行所述。 –
+1,如果僅用於使用「assList」。 – Iridium
這沒有任何意義。也不可能。從資源中讀取程序集並使用File.WriteAllBytes()保存它當然簡單得多。或者只是不把它放在首位的資源。 –
爲什麼你想要保存驢到磁盤?這是他們從哪裏加載的。你不能只是找出路徑,然後複製它們? – stakx