2013-07-21 23 views
9

Unterzeichnung fand ich diesen Artikel auf Codeproject: http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menuseinen F # Assembly (Strong Name-Komponente)

und dachte, es wäre schön, es zu versuchen, aber in F #. So kam ich mit dem folgenden Code auf:

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 

Allerdings habe ich festgestellt, dass es keine Unterstützung ist eine F # Montage in VS2012 (Schritt 4 im Artikel) für die Unterzeichnung. Ich habe gelernt, dass, wenn ich dies tun möchte, ich manuell einen Schlüssel erstellen muss (Eingabe von "sn-k keyName.snk" in die Eingabeaufforderung) und fügen Sie dann ein Flag in "Project Properties -> Build -> Other Flags" (--keyfile: Schlüsselname.snk).

Ich schaffte es immer noch nicht, dies erfolgreich auszuführen. Außerdem bekomme ich mit der Anwendung des Autors (im Abschnitt "Debugging der Shell-Erweiterung") einen Fehler, dass meine Assembly keinen COM-Server enthält.

Ich glaube, ich mache etwas falsch mit der Unterzeichnung der Komponente. Könntest du mir helfen, das zu tun?

+0

Ich glaube, Ihr Problem mit dem COM-Server-Fehler hat mit Ihrem Schlüssel zu tun, nicht mit der F #. Stellen Sie sicher, dass das von Ihnen verwendete Zertifikat auf Ihrem lokalen Computer registriert ist. – mydogisbox

+0

Sie können auch so etwas wie dies versuchen: 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

"Enthält keinen COM-Server" schlägt ein Problem mit der Sichtbarkeit/Registrierung Ihrer COM-Komponente vor. Sie können 'sn -v' verwenden (oder ist es' -V'?), Um Ihre Unterschrift zu verifizieren, aber unter dem Strich gibt es irgendwo einen Fehler, der den Authenticode-Signaturfehler sagt, wenn das das Problem ist. Und holen Sie ProcMon und DbgView auf den Fall. Wenn Sie weitere Details re genaue Fehlermeldungen usw., kein Schaden, um das Detail hier hinzufügen –

Antwort

13

Eine Möglichkeit zum Signieren einer F # -Assembly ist über das Attribut AssemblyFileKeyAttribute.

Erstellen Sie ein neues Modul und in sie:

module AssemblyProperties 

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

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

do() 

Wo "MyKey.snk" in das Projektverzeichnis den Pfad zu Ihrem Schlüssel ist relativ.

Eine weitere Möglichkeit, wie in diesem Bug-Report auf Microsoft Connect gefunden, ist --keyfile:MyKey.snk zum Other Flags Feld in den Properties --> Build Registerkarte hinzuzufügen.

Verwendung beider Ansätze; running sn -v myfsharpassembly.dll wird bestätigen, dass die Assembly nach der Kompilierung gültig ist.

0

Vielleicht ist das Problem, dass die Baugruppe nicht "ComVisible" ist?

Ich verwende diese Bibliothek in F # wie folgt aus:

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

Das heißt, ich fest, die Montage-Ebene Attribute in einem Top-Level-do-Block.