由于各种原因,我宁愿不在我的项目中使用强名称(签名)程序集.但是,其中一个项目由sharepoint Web部件引用,这意味着它必须签名.
是否可以对此程序集进行签名,但是当我从其他项目引用它时,使用非强引用来执行此操作.这将给我的优势是为我的其余代码提供一个非签名程序集,但仍然允许它由sharepoint加载.
我在项目中使用了一些未签名的库.因为我的应用程序是强签名的,所以库也必须如此.
我用以下方式签署这些库:
"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il
Run Code Online (Sandbox Code Playgroud)
问题是任何元数据(例如版本号)都会在现在签名的DLL中丢失.这是一个问题,因为现在库之间的某些依赖关系被破坏了.如何保留版本号而不需要实际编译这些库的源代码?
UPDATE
它实际上是一个显示此问题的特定DLL,我发现它是使用ILMerge构建的.也许这就是问题所在.需要明确的是:ILMerge生成的DLL确实具有正确的元数据,只有在反汇编和重组后,元数据才会消失.
更新2
我在Reflector中打开了DLL,看起来至少版本号仍在那里.我一直在使用Windows资源管理器中的文件属性对话框/详细信息选项卡进行检查.所以我认为这是缺少的清单.
情况如下:
[assembly: InternalsVisibleTo("...")]主项目AssemblyInfo.cs文件添加一个属性那么,我该如何解决这个问题呢?
如果我签署主项目输出而不是测试库,并且只在InternalsVisibleTo属性中指定程序集名称,则会出现此编译时错误:
错误1朋友程序集引用'Mercurial.Net.Tests'无效.强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥.C:\ Dev\VS.NET\Mercurial.Net\Mercurial.Net\Properties\AssemblyInfo.cs 22 31 Mercurial.Net
所以显然没有签署测试项目输出是不够的.
我唯一的选择是删除签署项目的设置,并修改项目文件作为我的二进制文件构建脚本的一部分?即.<SignAssembly>false</SignAssembly>在构建之前,搜索项目文件的元素并进行修改?
基于这个问题,我尝试使用<codebase>定位外部组件.现在,当我运行该程序时,我收到一条错误消息,指出私有程序集位于appbase之外.我该如何解决这个问题?我看到的一个建议就是签署集会.我做了这个,但后来我的程序找不到程序集.当我取消签名时,我收到outside the appbase错误.如何加载位于其他地方使用<codebase>而不是安装到GAC的程序集?(探测也不起作用,似乎它仍然必须存在于应用程序文件夹中)我的配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NGameHost"
culture="neutral" />
<codeBase version="1.0.0.0"
href="C:/Program Files/NetworkGame3/api/NGameHost.exe"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud) c# codebase console-application .net-assembly assembly-signing
我试图在单声道F#中签署一个dll时遇到错误:
$ mono /usr/local/share/FSharp-2.0.0.0/bin/fsc.exe\
--target:library \
--keyfile:../../external/MyKeyFile.snk\
AssemblyInfo.fs\
../../fs/FooBar.fs\
-o:FooBar.dll
Run Code Online (Sandbox Code Playgroud)
没有生成DLL,我收到此错误:
Microsoft (R) F# 2.0 Compiler build 2.0.0.0 Copyright (c) Microsoft Corporation. All Rights Reserved.`
error FS2014: A problem occurred writing the binary '': A call to StrongNameGetPublicKey failed (mscoree.dll)`
Run Code Online (Sandbox Code Playgroud)
密钥文件是在Windows中生成的,这有什么不同吗?
更新:
使用Mono 2.6.4
$ mono --version
Mono JIT compiler version 2.6.4 (tarball Mon Jun 21 19:26:21 UTC 2010)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
TLS: __thread
GC: Included Boehm (with typed GC and Parallel Mark)
SIGSEGV: altstack …Run Code Online (Sandbox Code Playgroud) 我试图使用密码保护密钥文件(pfx)以编程方式签署程序集.但是,当我尝试使用StrongNameKeyPair时,我得到以下异常.
无法获取StrongNameKeyPair的公钥.在System.Reflection.StrongNameKeyPair.ComputePublicKey()处于System.Reflection.StrongNameKeyPair.get_PublicKey()
我有一个C#可执行文件,使用强密钥签名.从这个C#应用程序我使用'pinvoke'调用C++执行(没有签名).我观察到C++可执行文件的优化有很大的延迟.这有什么理由吗?
我正在尝试创建包含Castle.Core的FakeItEasy的合并版本.我读到了有关ILMerge的信息,看起来这是我需要的解决方案.下载并构建FakeItEasy后,我将所需的所有文件(FakeItEasy.dll(.NET4),Castle.Core.dll(.NET4),ilmerge.exe,FakeItEasy.snk)复制到同一文件夹中.然后我运行以下命令:
ilmerge
/keyfile:FakeItEasy.snk
/out:..\FakeItEasy.dll
/t:library
/targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319
FakeItEasy.dll Castle.Core.dll
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
An exception occurred during merging:
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob)
at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)
at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)
at ILMerging.ILMerge.Merge()
at ILMerging.ILMerge.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)
如果我放弃"/keyfile:FakeItEasy.snk",合并的程序集就会很好地创建,但这对我没有帮助,因为我需要一个签名版本.
我也尝试将目标平台指定为:
/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.
我的Visual Studio 2010解决方案引用了第三方专有DLL.
当我尝试编译解决方案时,错误消息显示为:
无法发出程序集:引用的程序集"NameOfAssembly.DLL"没有强名称
使用我自己的密钥签署第三方DLL是解决此问题的唯一方法吗?
我必须对在visual studio 2012中创建的WPF应用程序进行数字签名.goodday.com为此提供".spc"文件.但我的visual studio需要pfx文件格式.如何获得PFX格式的证书?
c# wpf code-signing assembly-signing code-signing-certificate
assembly-signing ×10
.net ×5
c# ×5
code-signing ×3
assemblies ×1
c#-3.0 ×1
c#-4.0 ×1
codebase ×1
f# ×1
ilasm ×1
ilmerge ×1
mono ×1
pinvoke ×1
pkcs#12 ×1
strongname ×1
vb.net ×1
wpf ×1