【问题标题】:Signing an F# Assembly (Strong name component)签署 F# 程序集(强名称组件)
【发布时间】:2013-07-20 13:32:59
【问题描述】:

我在 CodeProject 上找到了这篇文章: 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 服务器。

我相信我在签署组件时做错了。你能帮我运行这个吗?

【问题讨论】:

  • 我相信您的 COM 服务器错误问题与您的密钥有关,与 F# 无关。确保您使用的证书已在本地计算机上注册。
  • 你也可以试试这样的:books.google.com/…
  • “不包含 COM 服务器”表明您的 COM 组件的可见性/注册存在问题。您可以使用sn -v(或者是-V?)来验证您的签名,但最重要的是,如果这是问题所在,那么在某处会出现一个错误,说明身份验证签名错误。并获取有关此案的 ProcMon 和 DbgView。如果您收到更多详细信息和确切的错误消息等,请在此处添加该详细信息
  • 我运行了 "sn -v " 并导致程序集 'ShellExtentions.dll' is valid 更准确​​地说,当我尝试在服务器管理器中加载此程序集时(从文章),我收到一个错误“ 不是 SharpShell 扩展”。我也尝试在 GAC 中注册程序集,但也没有用。

标签: com f# strongname shell-extensions code-translation


【解决方案1】:

签署 F# 程序集的一种方法是通过 AssemblyFileKeyAttribute 属性。

创建一个新模块并将其放入:

module AssemblyProperties

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

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

do()

其中"MyKey.snk" 是您的密钥相对于项目目录的路径。

在Microsoft Connect 的此错误报告中发现的另一种方法是将--keyfile:MyKey.snk 添加到Properties --&gt; Build 选项卡中的Other Flags 字段。

使用任一方法;运行sn -v myfsharpassembly.dll 将断言程序集在编译后是有效的。

【讨论】:

    【解决方案2】:

    也许问题在于程序集不是“ComVisible”?

    我在 F# 中像这样使用这个库:

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

    也就是说,我在顶级 do-block 中指定程序集级属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 2010-11-16
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多