如果我强烈命名一个带有.snk文件的类库,如果我创建同一个库的新版本,是否需要用新的.snk文件替换?
我有两个组件A和B. A是强名称而B不是.
根据MSDN,我不能从A引用B,因为强名称程序集只能引用另一个强名称程序集.
但是为什么可以加载程序集B,实例化它的类并使用反射从程序集A调用它们的方法?
// Inside assembly A
Assembly b = Assembly.LoadFrom("B");
obj myObj = b.CreateInstance("MyClass");
Run Code Online (Sandbox Code Playgroud)
这是否会破坏不允许在签名组中引用未签名组件的目的?
这是对Mono xbuild错误CS1548的跟进 - 密钥文件格式不正确
嗨,我有一个使用VS2008用C#编写的应用程序.目前我们正在使用Mono将此应用程序移植到Mac.
我试图从pfx文件中提取密钥.我先用过
`sn -pc key.pfx key.snk`
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误
'Failed to extract public key for key pair -- Keyset does not exist'.
Run Code Online (Sandbox Code Playgroud)
然后我用了
`sn -p key.pfx key.snk`
Run Code Online (Sandbox Code Playgroud)
这创建了我想要的snk文件.然后我在单声道选择了项目选项>程序集签名时构建错误
'key.snk is missing private key needed for signing'.
Run Code Online (Sandbox Code Playgroud)
我想我明白,如果我创建一个新的snk密钥,我可以在其中包含私钥和公钥.只是因为遗留问题,我们真的希望能够使用原始的pfx密钥值.
从谷歌获得指令后,我尝试使用以下命令创建StrongNameFile:
C:\Program Files\Microsoft Visual Studio 9.0\VC\sn -k StrongNameFile.snk
Run Code Online (Sandbox Code Playgroud)
当我运行该命令时,我收到一条错误消息:
'sn' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
我用以下方式尝试了它:
C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin>sn -k StrongNameFile.snk
Run Code Online (Sandbox Code Playgroud)
但得到了同样的错误.请有人帮我解决这个问题.
我时不时地在网络上看到一个示例项目,其中包含一个 .snk 文件,用于使用强名称对编译结果进行签名。
AFAIK这是完全错误的- 一旦 .snk 文件被披露,任何人都可以生成一个程序集,该程序集可用于替换原始代码供应商提供的程序集,但现在包含恶意代码。我想传送 .snk 文件的人不会认真对待这种风险而只是传送文件,否则项目将无法编译现成的。
除了“方便”之外,是否有任何理由发送 .snk 文件?
我正在使用一个C#应用程序,它使用EasyHook库进行DLL注入.EasyHook要求使用它的任何应用程序都有很强的名称.为了强烈命名应用程序,我需要确保我使用的所有库都具有强名称.
这对我的所有托管库都很容易,但我还有一个非托管的c ++库,我需要强烈命名.经过一些搜索,我似乎无法找到一种方法来签署我的非托管DLL,即使使用源代码也是如此.可以这样做,如果是这样,我还需要做什么?
感谢您的任何建议或帮助!
GreatLib.dll的供应商部署了一个自定义控件。它正在客户Winforms应用程序中使用。GreatLib具有很强的命名能力,并公开了一些类型。当这些类型用作客户窗体中的公共属性时,它们也可以在Windows窗体设计器中使用。这是麻烦开始的地方:
设计人员将在表单的资源文件中为所有这些类型创建项目,并在这些项目中序列化其default(?)值。由于GreatLib是严格命名的,因此引用将包含程序集的完全限定名称。(我认为这就是Resgen所做的事情?)。这些项目可能如下所示:
<data name="vector3Control1.value" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFRJTE51bWVyaWNzLCBWZXJzaW9uPTQuMi41MzM4LjQ4MDIxLCBD
dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPThkOWJmNTBlZjg1NDczNGQFAQAAABpJTE51bWVy
aWNzLkRyYXdpbmcuVmVjdG9yMwMAAAADbV94A21feQNtX3oAAAALCwsCAAAAAAAAAAAAAAAAAAAACw==
</value>
</data>
Run Code Online (Sandbox Code Playgroud)
设计器在Form.Designer.cs文件中生成一些与此类似的代码,以便读取资源项:
this.vector3Control1.value = ((ILNumerics.Drawing.Vector3)(resources.GetObject("vector3Control1.value")));
Run Code Online (Sandbox Code Playgroud)
供应商提供了对GreatLib的更新,客户将旧版本替换为新版本。但是资源文件将保持不变!因此,我们可以在Designer.cs代码上获得InvalidCastExeption,或者-如果不再找到旧程序集-则是FileNotFoundException。
建议使用哪种方式处理resx文件中的强名称?
通过使用完全防止它们
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
Run Code Online (Sandbox Code Playgroud)
?还是按照HansPassant的建议在每次更新时手动转换base64数据?
resources strongname windows-forms-designer visual-studio winforms
我有一个 .NET 程序集,我对其进行了强命名,并将其放入 GAC 中。.pfx但是,稍后还会使用文件对同一程序集进行数字签名,以进行数字签名。
我注意到这个经过双重签名的程序集未通过强名称验证,并且不会安装在目标计算机的 GAC 中。
数字签名过程是否有可能删除 SN 密钥生成的强命名过程?
数字签名是必不可少的,如果两者不兼容,那么文件可以由数字签名吗?.pfx像 SN 命名过程一样简单地由文件对文件进行签名?
另外,程序集位于C++/CLI,而不是C#。
编辑:查看MSDN 文档,它说是否使用链接器选项进行强命名,以及是否使用像这样的后处理工具mt.exe(我不确定是否Signtool.exe属于这些工具),则需要重新签署程序集。
另外,这个声明:
如果在开发环境中生成时使用签名属性,则可以通过在生成后事件中显式调用 sn.exe(Sn.exe(强名称工具))来成功对程序集进行签名。
...有点令人困惑。它指的是哪些属性,CLR属性还是Linker选项?
我有一个针对 .NET Core 和 .NET Framework 进行编译的 NuGet 包库项目。它还使用新的公共签名。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Build">
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Label="Signing">
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>../../Key.snk</AssemblyOriginatorKeyFile>
<PublicSign>true</PublicSign>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我有一个 xUnit 测试项目,使用它也可以交叉编译到 .NET Core 和 .NET Framework。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Label="Build">
<TargetFrameworks>netcoreapp3.1;net472</TargetFrameworks>
</PropertyGroup>
<ItemGroup Label="Package References">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
</ItemGroup>
<ItemGroup Label="Project References">
<ProjectReference Include="..\..\Source\Foo\Foo.csproj" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
当我在此项目中运行测试时,.NET Core 测试运行成功,但 .NET Framework 测试运行失败,并显示:
System.IO.FileLoadException:无法加载文件或程序集“Foo,Version=0.0.1.0,Culture=neutral,PublicKeyToken=fc5550082a9c642c”或其依赖项之一。无法验证强名称签名。该程序集可能已被篡改,或者已延迟签名但未使用正确的私钥完全签名。(HRESULT 异常:0x80131045)
我怎样才能让他们都工作?
System.IO.FileSystem.Primitives -> b03f5f7f11d50a3a
System.Runtime.CompilerServices.Unsafe -> b03f5f7f11d50a3a
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
具有相同标识“ System.IO.FileSystem.Primitives , Version=4.0.2.0, Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a ”的程序集已导入。尝试删除重复的引用之一。
strongname ×10
.net ×6
c# ×3
snk ×3
assemblies ×2
.net-core ×1
asp.net ×1
authenticode ×1
c++-cli ×1
mono ×1
pfx ×1
pkcs#12 ×1
reflection ×1
resources ×1
unmanaged ×1
winforms ×1
xunit ×1