两个问题:
1)ILMerged程序集中不包含基本.NET程序集
从.NET 3.5/Visual Studio 2008升级到.NET 4/Visual Studio 2010后,我在后期构建中使用ILMerge时遇到问题.我有一个解决方案,其中有几个项目的目标框架设置为".NET Framework 4" .我使用以下ILMerge命令将单个项目DLL合并到一个DLL中:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
Run Code Online (Sandbox Code Playgroud)
如果我不指定.NET 4框架目录的位置,我会从ILMerge得到"Unresolved assembly reference not allowed:System"错误.如果我不指定MSTest目录的位置,我得到"不允许未解析的程序集引用:Microsoft.VisualStudio.QualityTools.UnitTestFramework"错误.
上面的ILMerge命令工作并生成DLL.但是,当我在另一个.NET 4 C#项目中引用该DLL并尝试使用其中的代码时,我收到以下警告:
无法解析主要引用"MyILMergedDLL",因为它对.NET Framework程序集"mscorlib,Version = 4.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"具有间接依赖性,其版本"4.0.65535.65535"高于版本当前目标框架中的"4.0.0.0".
如果我然后删除该/targetplatform:v4标志并尝试使用MyILMergedDLL.dll,我收到以下错误:
"System.Xml.Serialization.IXmlSerializable"类型在未引用的程序集中定义.您必须添加对程序集'System.Xml,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用.
看起来我不应该这样做.使用我的MyILMergedDLL.dll API的人不应该添加对它引用的任何库的引用.我怎么能绕过这个?
2)仅在使用合并程序集时出现TypeLoadException
编辑:除此之外,即使我System.Xml在使用MyILMergedDLL.dll的使用者项目中添加引用,使用MyILMergedDLL.dll中的一些代码也会产生以下异常:
System.TypeLoadException:无法从程序集'MyILMergedDLL,Version = 1.0.1.1,Culture = neutral,PublicKeyToken = …
场景:我使用Web部署项目部署了一个n层企业ASP.NET应用程序.所有层都生成ASP.NET应用程序使用的独立程序集.
问题:当我运行应用程序时.部署后第一次将相关程序集加载到内存中需要花费大量时间.但一旦加载其照明快速应用程序.如果没有用户访问该应用程序,IIS将从内存中卸载程序集,当用户尝试在以后的实例上访问该应用程序时,它会再次加载所有程序集,并且需要花费相同的时间来加载它这是第一次这样做.
我正在寻找一种解决方案,使我能够将我的程序集加载到内存中,持续覆盖程序集的易变性,以实现内存驻留.
或任何其他解决方案,让我的用户愉快地使用该应用程序解决上述问题.
此程序集位于GAC中:Microsoft.SqlServer.Management.RegisteredServers.dll
如何在Visual Studio中添加对此程序集的引用?
我可以在c:\ windows\assembly \中查看该文件
如何找到程序集的完全限定名称,例如:
MyNamespace.MyAssembly, version=1.0.3300.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud)
我已经设法使用sn.exeSDK中的我的PublicKeyToken ,但我想轻松获得完整的限定名称.
我有一个由五个项目组成的解决方案,每个项目都编译为单独的程序集.现在我正在对它们进行代码签名,但我很确定我做错了.这里的最佳做法是什么?
基本上我不太确定"签名"对他们有什么影响,或者最佳实践是什么,所以更普遍的讨论会很好.我真正知道的是,FxCop对我大吼大叫,点击"签署此程序集"复选框并使用Visual Studio(2008)生成.pfx文件很容易修复.
我正在尝试使用System.Web.dll程序集中包含的HTTP函数.但是,尽管dll似乎与我的项目中的每个其他dll Visual Studio 2010引用存在于同一目录中,但它无法链接并引发警告 - "无法找到引用的组件'System.Web'".然而,dll肯定存在于与项目引用的所有其他文件夹相同的文件夹中,并且在"浏览参考"模式中选择它允许我添加它 - 然后它无法填写"路径"属性.难道我做错了什么?如何在我的项目中使用System.Web?
任何帮助深表感谢!
编辑:我在"添加引用"窗口的.Net选项卡中没有对System.Web的任何引用.
Assembly.GetEntryAssembly()不适用于Web应用程序.
但是......我真的需要这样的东西.我使用了一些在Web和非Web应用程序中使用的深层嵌套代码.
我目前的解决方案是浏览StackTrace以找到第一个被调用的程序集.
/// <summary>
/// Version of 'GetEntryAssembly' that works with web applications
/// </summary>
/// <returns>The entry assembly, or the first called assembly in a web application</returns>
public static Assembly GetEntyAssembly()
{
// get the entry assembly
var result = Assembly.GetEntryAssembly();
// if none (ex: web application)
if (result == null)
{
// current method
MethodBase methodCurrent = null;
// number of frames to skip
int framestoSkip = 1;
// loop until we cannot got further in …Run Code Online (Sandbox Code Playgroud) 我有一个DLL集合(比如20).如何找出一个特定DLL(比如DLL A)所依赖的所有DLL?
assemblies ×10
.net ×5
c# ×4
gac ×2
appdomain ×1
asp.net ×1
c#-4.0 ×1
deployment ×1
dll ×1
iis ×1
ilmerge ×1
reflection ×1
signing ×1
stack-frame ×1
strongname ×1
system.web ×1
version ×1