2013-07-21 16 views
9

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?

+0

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

+0

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

+0

"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 –

risposta

13

Un modo per firmare un assembly F # è tramite l'attributo AssemblyFileKeyAttribute.

Creare un nuovo modulo e in essa mettere:

module AssemblyProperties 

open System 
open System.Reflection; 
open System.Runtime.InteropServices; 

[<assembly:AssemblyKeyFileAttribute("MyKey.snk")>] 

do() 

Dove "MyKey.snk" è il percorso del tasto relativo alla directory di progetto.

Un altro modo, come si trova in questo rapporto bug su Microsoft Connect, è quello di aggiungere --keyfile:MyKey.snk al campo Other Flags nella scheda Properties --> Build.

utilizzando entrambi gli approcci; l'esecuzione di sn -v myfsharpassembly.dll asserirà che l'assembly è valido dopo la compilazione.

0

Forse il problema è che l'assembly non è "ComVisible"?

sto usando questa libreria in F # come questo:

[<assembly:ComVisible(true)>] 
[<assembly:AssemblyKeyFile("Key.snk")>] 
do 
    () 

Cioè, ho specificare il livello di assemblaggio attribuisce ad un livello superiore do-block.

Problemi correlati