Ho trovato questo articolo su CodeProject: http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-MenusFirma di un F # Assembly (componente nome Strong)
e ho pensato che sarebbe bello fare un tentativo, ma in F #. Così mi è venuta con il seguente codice:
open System
open System.IO
open System.Text
open System.Runtime.InteropServices
open System.Windows.Forms
open SharpShell
open SharpShell.Attributes
open SharpShell.SharpContextMenu
[<ComVisible(true)>]
[<COMServerAssociation(AssociationType.ClassOfExtension, ".txt")>]
type CountLinesExtension() =
inherit SharpContextMenu.SharpContextMenu()
let countLines =
let builder = new StringBuilder()
do
base.SelectedItemPaths |> Seq.iter (fun x -> builder.AppendLine(sprintf "%s - %d Lines" (Path.GetFileName(x)) (File.ReadAllLines(x).Length)) |> ignore )
MessageBox.Show(builder.ToString()) |> ignore
let createMenu =
let menu = new ContextMenuStrip()
let itemCountLines = new ToolStripMenuItem(Text = "Count Lines")
do
itemCountLines.Click.Add (fun _ -> countLines)
menu.Items.Add(itemCountLines) |> ignore
menu
override this.CanShowMenu() = true
override this.CreateMenu() = createMenu
Tuttavia, ho notato che non v'è alcun supporto per la firma di un assemblaggio F # in VS2012 (punto 4. in questo articolo). Ho imparato che se voglio farlo, ho bisogno di creare manualmente una chiave (digitando "sn -k keyName.snk" nel prompt dei comandi) e quindi aggiungere un flag in "Proprietà del progetto -> Build -> Altre bandiere" (--keyfile: keyName.snk).
Non riesco ancora a eseguire correttamente questa operazione. Inoltre, usando l'applicazione dell'autore (nella sezione "Debugging the Shell Extension") ricevo un errore che il mio assembly non contiene un server COM.
Credo di fare qualcosa di sbagliato con la firma del componente. Potresti aiutarmi a farlo?
Credo che il tuo problema con l'errore del server COM abbia a che fare con la tua chiave, non con F #. Assicurati che il certificato che stai utilizzando sia registrato con il tuo computer locale. – mydogisbox
Si può anche provare qualcosa di simile: http://books.google.com/books?id=66jOWQEvBMEC&pg=PA540&lpg=PA540&dq=F%23+keyfile&source=bl&ots=e26aaV710y&sig=7OXthSKQPwnMUESnVstC5DXwk14&hl=en&sa=X&ei=xkPtUe_BOey6yAGpjIC4BQ&ved=0CG4Q6AEwCQ#v = onepage & q = F% 23% 20keyfile & f = false – mydogisbox
"Non contiene un server COM" suggerisce un problema con la visibilità/registrazione del componente COM. Puoi usare 'sn -v' (o è' -V'?) Per verificare la tua firma, ma in fondo c'è un errore da qualche parte che dice errore di firma dell'autenticode se questo è il problema. E ottenere ProcMon e DbgView sul caso. Se ottieni ulteriori dettagli sui messaggi di errore esatti, non c'è nulla di male da aggiungere qui dettagli –