簡體   English   中英

VB.NET 2010 - 從 My.Resources 中提取/保存 ICO 文件

[英]VB.NET 2010 - Extract/Save ICO file from My.Resources

標題說明了一切,例如,如何將文件從應用程序資源保存到桌面?

將來它會創建一個目錄並將其存儲在那里,本質上我正在制作一個游戲安裝程序,但現在這些都不重要。

我嘗試了大約 6 種不同的代碼方法,但都失敗了,不斷拋出有關無法將圖標/圖像轉換為一1-dimensional array的錯誤。 或者“圖標”或“圖像”不是System.Drawing.Icon的成員

任何幫助將不勝感激 謝謝!

編輯:發布一些我試過的代碼。

#1(“長度”不是 System.Drawing.Icon 的成員)

Dim File01 As System.IO.FileStream = New System.IO.FileStream("C:\Users\" + Environment.UserName + "\Desktop\" + "EXAMPLE_Icon.ico", IO.FileMode.Create) File01.Write(My.Resources.EXAMPLE_Icon, 0, My.Resources.EXAMPLE_Icon.length) File01.Close()

#2('System.Drawing.Icon'不能轉換為'一維字節數組)

Dim filePath = Path.Combine("C:\Users\" + Environment.UserName + "\Desktop\", "EXAMPLE_Icon.ico") File.WriteAllBytes(filePath, My.Resources.EXAMPLE_Icon)

#3(“RawFormat”不是“System.Drawing.Icon”的成員)

Dim filePath = Path.Combine("C:\Users\" + Environment.UserName + "\Desktop\", "EXAMPLE_Icon.ico") Using icon = My.Resources.EXAMPLE_Icon icon.Save("C:\Users\" + Environment.UserName + "\Desktop\", icon.RawFormat) End Using

  • 合成路徑時使用Path.Combine()構建目標路徑。

  • 許多已知的系統位置在Environment.SpecialFolder中都有一個預定義的值:在您的例子中,是Environment.SpecialFolder.Desktop Environment.GetFolderPath()接受這些值之一並返回正確的文件系統路徑。
    這將返回當前用戶的桌面文件夾路徑:

     Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
  • 圖標 object 有一個接受 Stream 作為參數的Save()方法。
    您可以傳遞一個FileStream以將圖標保存到一個文件,保留其格式,或傳遞一個MemoryStream ,然后使用File.WriteAllBytes()調用其ToArray()方法來保存 MemoryStream 的緩沖區。

使用資源名稱,作為字符串,使用ResourceManager.GetObject()

Dim iconPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "myIcon.ico")

Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None),
    ico = TryCast(My.Resources.ResourceManager.GetObject("myIcon"), Icon)
    ico?.Save(stream)
End Using

或者,取決於更適合您的運營環境的內容:

Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None)
    My.Resources.myIcon.Save(stream)
End Using
GC.Collect()

注意:在這里,我直接在 My.Resources 生成的圖標My.Resources上調用Save() GC.Collect() Docs 沒有准確解釋它: My.Resources是一個工廠,它不返回存儲在項目 Resources 中的 object ,它從存儲為 Resource 的數據生成一個新的 object (每次不同)。 使用My.Resources.myIcon.Save(stream) ,我們創建了一個新的 object,將其數據保存到光盤,但從未真正處理過它。 之后立即調用GC.Collect() ,使用的 memory 立即被回收。 如果我們不這樣做,那 memory 永遠不會被回收(我們正在泄漏)。

最好將生成的 object a 分配給Using語句聲明的臨時變量。 下面的兩個方法可以利用GC.Collect() ,在之后立即調用它,立即回收分配的 memory ,但這並不是嚴格要求的,我們並不是真的在泄漏資源。
打開 Visual Studio 的Diagnostic Tools來測試使用和不使用GC.Collect()的行為,多次調用這些方法。

Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None),
    ico = My.Resources.myIcon
    ico.Save(stream)
End Using
' GC.Collect()  <= Not strictly required, but test the difference

或者使用 MemoryStream:

Using ms As New MemoryStream(),
    ico As Icon = My.Resources.myIcon
    ico.Save(ms)
    ms.Position = 0
    File.WriteAllBytes(iconPath, ms.ToArray())
End Using
' GC.Collect()  <= Not strictly required, but test the difference

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM