2013-07-21 26 views
9

tôi tìm thấy bài viết này trên CodeProject: http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-MenusKý một F # hội (tên Mạnh component)

và nghĩ rằng nó sẽ được tốt đẹp để cung cấp cho nó một thử, nhưng trong F #. Vì vậy, tôi đã đưa ra mã sau:

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 

Tuy nhiên, tôi nhận thấy rằng không có hỗ trợ ký hợp đồng F # trong VS2012 (bước 4. trong bài viết). Tôi đã học được rằng nếu tôi muốn làm như vậy, tôi cần phải tạo một khóa bằng tay (gõ "sn -k keyName.snk" vào dấu nhắc lệnh) và sau đó thêm một lá cờ trong "Thuộc tính dự án -> Xây dựng -> Cờ khác" (--keyfile: keyName.snk).

Tôi vẫn không quản lý thành công việc này. Hơn nữa, bằng cách sử dụng ứng dụng của tác giả (trong phần "Gỡ lỗi Shell mở rộng") tôi nhận được một lỗi mà lắp ráp của tôi không chứa một máy chủ COM.

Tôi tin rằng tôi đang làm điều gì đó sai khi ký hợp phần. Bạn có thể giúp tôi trong việc này không?

+0

Tôi tin rằng sự cố của bạn với lỗi máy chủ COM phải thực hiện với khóa của bạn, không phải với F #. Đảm bảo chứng chỉ bạn đang sử dụng được đăng ký với máy cục bộ của bạn. – mydogisbox

+0

Bạn cũng có thể thử một cái gì đó như thế này: http://books.google.com/books?id=66jOWQEvBMEC&pg=PA540&lpg=PA540&dq=F%23+keyfile&source=bl&ots=e26aaV710y&sig=7OXthSKQPwnMUESnVstC5DXwk14&hl=vi&sa=X&ei=xkPtUe_BOey6yAGpjIC4BQ&ved=0CG4Q6AEwCQ#v = onepage & q = F% 23% 20keyfile & f = false – mydogisbox

+0

"Không chứa máy chủ COM" đề xuất sự cố với khả năng hiển thị/đăng ký thành phần COM của bạn. Bạn có thể sử dụng 'sn -v' (hoặc là nó' -V'?) Để xác minh ký của bạn nhưng dòng dưới cùng là sẽ có một lỗi ở đâu đó nói lỗi chữ ký xác thực nếu đó là vấn đề. Và nhận được ProcMon và DbgView về vụ án. Nếu bạn nhận được bất kỳ thông tin chi tiết hơn lỗi chính xác vv, không có hại để thêm chi tiết ở đây –

Trả lời

13

Một cách để ký hợp đồng F # là thông qua thuộc tính AssemblyFileKeyAttribute.

Tạo một module mới và đưa vào đó:

module AssemblyProperties 

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

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

do() 

đâu "MyKey.snk" là đường dẫn đến tương đối quan trọng của bạn vào thư mục của dự án.

Một cách khác, như được tìm thấy trong báo cáo lỗi này trên Microsoft Connect, là thêm --keyfile:MyKey.snk vào trường Other Flags trong tab Properties --> Build.

Sử dụng một trong hai cách tiếp cận; chạy sn -v myfsharpassembly.dll sẽ khẳng định rằng assembly là hợp lệ sau khi biên dịch.

0

Có thể vấn đề là lắp ráp không phải là "ComVisible"?

Tôi đang sử dụng thư viện này trong F # như thế này:

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

Đó là, tôi chỉ định lắp ráp cấp tính ở cấp cao nhất làm-block.

Các vấn đề liên quan