我正在尝试将第三方COM dll加载到我的应用程序中.一切都很好,但是当我运行应用程序时,我不断从我的应用程序中收到此消息:
无法加载文件或程序集""程序集",Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.需要一个强名称的程序集.(来自HRESULT的异常:0x80131044).
当我这样做时,sn -vf "assembly"它说集会是有效的.以前有没有人见过这种行为?
我曾经使用BinaryFormatter(c#)序列化树视图.正是这样做并且包含所有可序列化类的程序集现在具有强名称并且已签名并且还获得了新版本号(但是,实现没有改变).
当我尝试反序列化byte []数组时,该行
(TreeViewData)binaryFormatter.Deserialize(memoryStream);
Run Code Online (Sandbox Code Playgroud)
产生ArgumentNullException.(参数名称:类型)
我认为版本号是问题,所以我实现了一个自己的Binder.我覆盖了BindToType方法,并确保更正版本并返回正确的类型.
但是,在此刻,程序离开了BindToType方法,我仍然得到上面提到的异常.
我该如何解决?
好吧,我必须愚蠢,因为我已经读过这个:http: //www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/
而我仍然没有得到它......
假设我打开项目的属性并转到"签名"选项卡,然后选中"签署程序集"并生成一个带密码的新程序集.创建了带有.pfx扩展名的强名称密钥文件,包括公钥和私钥,VS将在编译时对我的程序集进行数字签名,对吧?
私钥怎么样?不应该是私人和我,开发人员,是唯一拥有它的人吗?组件不应仅使用公钥签名吗?
任何人都可以向我解释这个吗?基本上,我想签署我的项目的程序集,并允许我用户检查程序集是否真的由我开发,我是唯一保留私钥(我认为我应该).
Visual Studio 2012 SDK中的默认VSPackage模板生成一个使用强命名的项目.
因为强命名是可传递的,这意味着我添加的任何引用(例如,同一解决方案中的另一个项目,或第三方依赖项)也需要强名称.
由于我不觉得强烈命名第三方依赖,我宁愿从我的VSIX中删除强命名.
这样做的缺点是什么?
我在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) …Run Code Online (Sandbox Code Playgroud) 我在尝试签署F#类库项目时遇到了很多麻烦.首先,我使用AssemblyKeyFileAttribute尝试了这个线程,但没有成功.我还尝试将标志"--keyfile:keyfile.snk"添加到项目属性("构建"选项卡中的"其他标志"字段),它也没有用.我正在使用Visual Studio 2013,它没有像C#类库项目那样显示"签名"选项卡.
所有尝试都会导致以下错误:
FSC:错误FS2014:写入二进制文件'obj\Release\ExcelFinancialFunctions.dll'时出现问题:对StrongNameGetPublicKey的调用失败(值不在预期范围内.)
我究竟做错了什么?
我有一个包含多个c#类库的ac#解决方案.我最近正在做一些研究,建议我的库中输出的程序集应该签名,并使用强名称签名.首先,我想知道我是否最好进步?从这些类库输出的库用于多个其他项目.
如果从我之前的问题建议我是的,我应该签署我的dll,我使用的.snk,这可以用于解决方案中的每个类库吗?或者每个类库必须是一键吗?
我正在运行Visual Studio 2012并在单独的解决方案中编写后端Web服务和桌面软件.由于桌面软件需要升级("作为管理员"),我需要在提升的Visual Studio实例中运行桌面解决方案.两种解决方案都包含签名库项目.
当我在Visual Studio实例中打开Web服务解决方案而不提升它时,我得到一个类似的构建错误
无法导入以下密钥文件:Redacted.pfx.密钥文件可能受密码保护.要更正此问题,请尝试再次导入证书,或使用以下密钥容器名称手动将证书安装到强名称CSP:VS_KEY_Redacted.
当我尝试通过这样做来解决这个问题时,它会失败并显示一条错误消息,指出密钥已经存在.
当我尝试排除然后重新包含PFX文件时没有把事情做对,但是在项目属性→登录空白时使"强名称密钥文件"下拉列表.接下来,Web服务解决方案构建,但似乎库没有签名,因为在(提升的)桌面解决方案中,构建失败,"程序集生成失败 - 引用程序集'编辑'没有强名称".
如果我尝试从Web服务解决方案中的下拉列表中再次选择PFX文件(并重新输入密码),我会得到:
导入密钥时出错
尝试引用不存在的令牌
从(提升的)桌面解决方案设置PFX文件可以正常工作,但会将我返回到正方形.
看起来,根据高程,Visual Studio会在不同的密钥库中查找可以解锁PFX的任何内容.我是否必须运行两个提升的Visual Studio实例来解决问题,或者我可以以某种方式告诉它在同一个地方查看?
我有一个需要强名称的代码库.
起初,我认为这将是一个简单的修复,因为我只是为我需要的ServiceStack程序集分配了强名称.由于ServiceStack中弱命名程序集之间存在依赖关系,因此失败.然后,我咬了一下子弹并使用我的密钥文件重新编译了ServiceStack - 这是不可取的,因为我没有看到可以在一个位置完成此操作并且必须将其添加到每个项目的方法.
即使这样,解决方案也无法通过测试构建:
[assembly: InternalsVisibleTo("ServiceStack.Common.Tests")]
Run Code Online (Sandbox Code Playgroud)
我发现自己处于一个下降的螺旋状态,不得不调整一些东西让它们工作,并使我自己越来越远离源库我想继续更新.
我该如何处理这个问题?我不喜欢这个地方......
strongname ×10
.net ×6
assemblies ×2
c# ×2
code-signing ×2
com ×2
f# ×2
servicestack ×1
signing ×1