所以我现在正在学习MSIL来学习调试我的C#.NET应用程序.
我一直想知道:堆栈的目的是什么?
只是把我的问题放在上下文中:
为什么从内存转移到堆栈或"加载?" 另一方面,为什么会从堆栈转移到内存或"存储"?
为什么不将它们全部放在内存中?
我正在努力掌握这一点,以帮助我更深入地理解CIL代码.
搜索后我尝试过的事情:
在Web.Config中对旧版本进行了绑定:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.1.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)编辑我的.csproj文件以确保只有一个Newtonsoft引用
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
Run Code Online (Sandbox Code Playgroud)在我的计算机上搜索每个Newtonsoft.Json.dll并删除每个非6.0.1版本并删除我的临时文件夹的内容
在nuget manager控制台中修复/重新安装软件包
它成功构建,但在访问网站时出错.
编辑
好吧,所以然后我尝试重新安装像每个nuget包,它似乎已经添加了4.5版本的newtonsoft.json.dll,但我得到相同的错误.我的项目的目标freamework是.NET 4.5.1,这是我现在得到的堆栈跟踪:
'/'应用程序中的服务器错误.
无法加载文件或程序集"Newtonsoft.Json"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.IO.FileLoadException:无法加载文件或程序集"Newtonsoft.Json"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
程序集加载跟踪:以下信息有助于确定无法加载程序集"Newtonsoft.Json"的原因.
===预绑定状态信息===日志:DisplayName = Newtonsoft.Json(部分)WRN:为程序集提供了部分绑定信息:WRN:程序集名称:Newtonsoft.Json | 域ID:2 WRN:仅提供部分程序集显示名称时发生部分绑定.警告:这可能导致装订器装入错误的装配.警告:建议为程序集提供完全指定的文本标识,即WRN:由简单名称,版本,区域性和公钥标记组成.警告:有关此问题的更多信息和常见解决方案,请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270.日志:Appbase = file:/// c:/ users/user/documents/visual studio 2013/Projects/foo/bar/LOG:Initial PrivatePath = c:\ users\user\documents\visual studio 2013\Projects\foo\bar\bin调用程序集:(未知).===日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:c:\ users\user\documents\visual studio 2013\Projects\foo\bar\web.config日志:使用主机配置文件:C:\ Users\user\Documents\IISExpress\config\aspnet .config日志:使用C:\ Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config中的计算机配置文件.日志:此时策略未应用于引用(私有,自定义,部分或基于位置的程序集绑定).日志:尝试下载新的URL文件:/// C:/ Users/user/AppData/Local/Temp/1/Temporary ASP.NET Files/root/48686d37/9d7a6572/Newtonsoft.Json.DLL.日志:尝试下载新的URL文件:/// C:/ Users/user/AppData/Local/Temp/1/Temporary ASP.NET Files/root/48686d37/9d7a6572/Newtonsoft.Json/Newtonsoft.Json.DLL.日志:尝试下载新的URL文件:/// c:/ users/user/documents/visual studio 2013/Projects/foo/bar/bin/Newtonsoft.Json.DLL.日志:使用应用程序配置文件:c:\ users\user\documents\visual studio 2013\Projects\foo\bar\web.config日志:使用主机配置文件:C:\ Users\user\Documents\IISExpress\config\aspnet …
我需要在web.config文件中重新创建一个提供程序,如下所示:
<membership defaultProvider="AspNetSqlMemProvider">
<providers>
<clear/>
<add connectionStringName="TRAQDBConnectionString" applicationName="TRAQ" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0"
name="AspNetSqlMemProvider"
type="System.Web.Security.SqlMembershipProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
/>
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
但是,我收到运行时错误,说无法加载此程序集,我认为这是因为我有错误的PublicKeyToken.如何查找我的程序集的PublicKeyToken?
或者,我是否完全采用错误的方式?
我试图使用以下代码在C#3.0中获取正在执行的程序集版本:
var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];
Run Code Online (Sandbox Code Playgroud)
还有另一种正确的方法吗?
我正在寻找关于如何管理.NET程序集的三个不同程序集版本号的指针,建议甚至口述.产品版本是最简单的,因为这似乎通常由业务决定.然后,文件版本似乎用于部署之间的版本控制,其中实际的程序集版本仅在发货时使用.
现在我只是想找一个简单的方法来标记组件的测试和维护版本,而这些版本都没有依赖,因此我正在考虑在文件版本上自动递增构建和修订版本号,并且为了最终版本,复制当前版本文件版本到程序集版本.该产品正在生产中使用,但仍在开发中 - 您知道 - 其中一家小公司,没有变更控制基础设施的情况.
.net versioning version-control assemblyversions .net-assembly
我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在某些情况下,我得到一个ReflectionTypeLoadException
调用asm.GetTypes()
,例如,如果程序集包含引用当前不可用的程序集的类型.
就我而言,我对导致问题的类型不感兴趣.我正在搜索的类型不需要不可用的程序集.
问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
我找到了大量有关此错误的信息:'错误:无法加载文件或程序集'*.dll'或其中一个依赖项.访问被拒绝.' 但我没有找到特定于我的情景的答案.我的站点部署在6个不同的生产服务器上,只在一台服务器上我正面临这个问题.问题是随机的,但是在它发生一次之后,它会一直持续到网站重新编译为web.config文件中的一个小修改(我知道技巧,在web.config中重新编译后重新编译Web应用程序)和该服务器上的站点启动工作.昨天,问题在一个月的工作期后再现.我们无法承担这个生产问题.
问题详情:
'/'应用程序中的服务器错误. ____________________________________ 无法加载文件或程序集"MainCore.DbImpl,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.访问被拒绝.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.IO.FileLoadException:无法加载文件或程序集"MainCore.DbImpl,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.访问被拒绝.
源错误:在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
程序集加载跟踪:以下信息有助于确定无法加载程序集"MainCore.DbImpl,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null"的原因.
警告:装配绑定日志记录已关闭.要启用程序集绑定失败日志记录,请将注册表值[HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)设置为1.注意:程序集绑定失败日志记录会导致一些性能损失.要关闭此功能,请删除注册表值[HKLM\Software\Microsoft\Fusion!EnableLog].
堆栈跟踪:
[FileLoadException:无法加载文件或程序集'MainCore.DbImpl,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.访问被拒绝.] ... DbImpl.Event.TTCEventController.GetEventFields(Int32 eventId)+0 WebSuite.SportChannel.ModelImpl.TTCModelController.AddEventFieldList(XmlElement eventNode,ITTCEventController ctrl,Int32 eventId,PlayerType stupidType)in ... root\SportChannel\ModelImpl\Ttc\TTCModelController.cs:171 ... ModelImpl.TTCModelController.GetLatestFourTourSchedulesXml()in ... root\SportChannel\ModelImpl\Ttc\TTCModelController.cs:283 ... WebRoot.UserControls.HeadlinesTab.Page_Load(Object sender ,EventArgs e)+491 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)+25 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,EventArgs e)+42 System. EventHandler.Invoke(Object sender,EventArgs e)+0 System.Web.UI.Control.OnLoad(EventArgs e)+132 System.Web.UI.Control.LoadRecursive()+66 System.Web.UI.Control.LoadRecursive( )+191 System.Web.UI.Control.LoadRecursive()+191 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeA syncPoint,Boolean includeStagesAfterAsyncPoint)+2428
____________________________________版本信息:Microsoft .NET …
我已经看到了这个:VSTS 2010 SGEN:错误:无法加载文件或程序集(HRESULT的异常:0x80131515)并且没有任何答案有效.当我构建或任何东西时它也不会出现.我可以运行该项目,当我尝试添加一个实体框架模板控制器时会发生这种情况:
然后我收到这个错误:
所有项目文件都在我的网络共享上,因为这是我的文档所在的工作所在.这是我尝试过的:
1)将项目设置中的发电机序列化装配转为开,关和自动.
2)使用以下代码将sgen.exe.config添加到C:\ Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0工具:
<configuration>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
3)尝试取消阻止程序集,但我在属性选项卡中没有取消阻止选项.
这些解决方案都不起作用.有谁知道如何解决这个问题??? 对于来自nuget或我自己的项目的任何自定义程序集,由于它们在网络空间中的位置而发生此错误,但仅在尝试添加EF模板控制器时发生.我可以构建并运行程序.
我已经读过这个技术:http://blogs.msdn.com/b/jjameson/archive/2009/04/03/shared-assembly-info-in-visual-studio-projects.aspx
基本上,它意味着创建一个SharedAssemblyInfo.cs,其中包含有关程序集的版本信息,并将此文件添加为解决方案的所有项目的链接,因此实际文件仅驻留在磁盘上的1个位置.
我的问题涉及两个场景:
不使用此机制的现有解决方案:有没有办法轻松地将ShareAssemblyInfo添加到所有项目?(假设我有50个项目的解决方案).
创建新项目时,默认情况下会创建一个新的AssemblyInfo.cs.但是,我想自动链接到SharedAssemblyInfo.
这有什么解决方案吗?常见的做法是什么?
.net-assembly ×10
.net ×7
c# ×3
asp.net ×1
asp.net-mvc ×1
assemblies ×1
cil ×1
dll ×1
gac ×1
json ×1
json.net ×1
plugins ×1
reflection ×1
vb.net ×1
versioning ×1