我在 CodeProject 上找到了这篇文章:http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus
并认为尝试一下会很好,但是是在 F# 中。所以我想出了以下代码:
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
但是,我注意到 VS2012 中不支持对 F# 程序集进行签名(本文中的步骤 4)。我了解到,如果我想这样做,我需要手动创建一个密钥(在命令提示符中输入“sn -k keyName.snk”),然后在“项目属性 - >构建 - >其他标志”中添加一个标志( --keyfile:keyName.snk)。
我仍然没有成功地运行这个。此外,使用作者的应用程序(在“调试 Shell 扩展”部分)时,我收到一个错误,表明我的程序集不包含 COM 服务器。
我相信我在签署组件时做错了什么。你能帮我运行这个吗?
签署 F# 程序集的一种方法是通过AssemblyFileKeyAttribute
属性。
创建一个新模块并在其中放入:
module AssemblyProperties
open System
open System.Reflection;
open System.Runtime.InteropServices;
[<assembly:AssemblyKeyFileAttribute("MyKey.snk")>]
do()
Where "MyKey.snk"
是密钥相对于项目目录的路径。
另一种方式,正如在这个错误报告中发现的那样微软连接 http://connect.microsoft.com/VisualStudio/feedback/details/497907/strong-naming-of-f-sharp-f-assembly-in-vs2010, 是添加--keyfile:MyKey.snk
to the Other Flags
领域中的Properties --> Build
tab.
使用任一方法;跑步sn -v myfsharpassembly.dll
将断言编译后程序集有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)