2013-07-21 18 views
9

Znalazłem ten artykuł na CodeProject: http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-MenusPodpisanie F # Assembly (nazwa silny komponent)

i pomyślałem, że byłoby miło, aby spróbować, ale w F #. Więc wpadłem na następujący kod:

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 

Jednak zauważyłem, że nie ma wsparcia dla podpisania # zespół F w VS2012 (krok 4. w artykule). Dowiedziałem się, że jeśli chcę to zrobić, muszę ręcznie utworzyć klucz (wpisując "sn -k keyName.snk" w wierszu polecenia), a następnie dodać flagę w "Właściwości projektu -> Kompilacja -> Inne flagi" (--keyfile: keyName.snk).

Nadal nie udało mi się z powodzeniem uruchomić tego. Co więcej, używając aplikacji autora (w sekcji "Debugowanie rozszerzenia powłoki") pojawia się błąd, że mój zespół nie zawiera serwera COM.

Uważam, że robię coś nie tak z podpisaniem komponentu. Czy możesz mi pomóc w prowadzeniu tego?

+0

Uważam, że twój problem z błędem serwera COM ma związek z twoim kluczem, a nie z F #. Upewnij się, że certyfikat, którego używasz, jest zarejestrowany na lokalnym komputerze. – mydogisbox

+0

Można również spróbować czegoś takiego: 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

"Nie zawiera serwera COM" sugeruje problem z widocznością/rejestracją twojego składnika COM. Możesz użyć 'sn -v' (lub jest to' -V'?), Aby zweryfikować swoje podpisywanie, ale w dolnej linii pojawi się błąd informujący o tym, że jest to problem. I zdobądź ProcMon i DbgView w sprawie. Jeśli otrzymasz więcej szczegółowych informacji o błędach itp., Nie zaszkodzę, aby dodać ten szczegół tutaj –

Odpowiedz

13

Jednym ze sposobów podpisania zespołu F # jest użycie atrybutu AssemblyFileKeyAttribute.

Utwórz nowy moduł i umieścić w nim:

module AssemblyProperties 

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

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

do() 

Gdzie "MyKey.snk" jest ścieżka do kluczowego w stosunku do katalogu projektu.

Innym sposobem, jak stwierdzono w raporcie bug na Microsoft Connect, jest dodanie --keyfile:MyKey.snk pola Other Flags w zakładce Properties --> Build.

Korzystanie z obu metod; uruchomienie sn -v myfsharpassembly.dll potwierdzi, że zestaw jest ważny po kompilacji.

0

Może problem polega na tym, że zespół nie jest "ComVisible"?

Używam tej biblioteki w F # tak:

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

Oznacza to, że mogę określić zespół poziomie atrybutów na najwyższym poziomie do-bloku.