我有一个SharePoint项目,我已经调试了一段时间没有问题.
今天我在项目的唯一功能中添加了一个功能接收器.我还没有改变Visual Studio默认添加的空接收器类的任何内容.
"Package"命令现在生成一个包,其中包含我的项目的DLL文件(正如您所期望的那样 - 添加一个功能接收器不应该改变这一点).
然而,当我调试,生成的包并没有包括我的项目的DLL文件,并部署努力失败,出现以下错误:
部署步骤"添加解决方案"发生错误:无法为功能"ABC_XYZ功能"加载接收器程序集"ABC,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 2377fad544a7c307"(ID:dca34989-a2f2-413b-b5c4-958e0bbb84ef ):System.IO.FileNotFoundException:无法加载文件或程序集'ABC,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 2377fad544a7c307'或其依赖项之一.该系统找不到指定的文件.文件名:'ABC,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 2377fad544a7c307'in System.Reflection.Assembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,Assembly locationHint,StackCrawlMark&stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection)在System.Reflection.Assembly.Asombly.Load的System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,Evidence assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection)中的System.Reflection.Assembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark&stackMark,Boolean forIntrospection) (字符串assemblyString)在Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()
警告:装配绑定日志记录已关闭.要启用程序集绑定失败日志记录,请将注册表值[HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)设置为1.注意:程序集绑定失败日志记录会导致一些性能损失.要关闭此功能,请删除注册表值[HKLM\Software\Microsoft\Fusion!EnableLog].
删除功能接收器允许我再次调试没有问题,但一旦我重新添加功能接收器问题就会返回.
我已经尝试过清理和重建,然后进行调试,但除非/直到我删除功能接收器,否则错误不会消失.
当我使用"Package"命令时,为什么我的项目程序集被包含在包中,而不是当我使用"Start Debugging"命令时,并且添加功能接收器会导致这种情况发生?
deployment assembly-resolution wsp sharepoint-2010 feature-receivers
我认为这可能是一个通用的.NET程序集加载问题,但在我的具体情况下,我希望我的SharePoint功能指向一个程序集,其版本控制与正确的SVN修订版号相关联.
我的程序集现已按照本文中的说明进行了版本控制.我希望能够将我的SharePoint功能配置为使用GAC中的最新版本的程序集.
<Feature Id="7b5d86e8-17dc-4943-8f4e-ad1068daf4f9"
Title="My happy feature"
Scope="Web"
Version="1.0.0.0"
Hidden="FALSE"
DefaultResourceFile="core"
ReceiverAssembly="HappyFeature, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d772fbab82fe6896"
ReceiverClass="HappyFeature.Receivers.HappyItemEventReceiver"
xmlns="http://schemas.microsoft.com/sharepoint/">
</Feature>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,SharePoint当然找不到程序集,因为强名称与此处描述的1.0.0.0版本不匹配.我在程序集中的当前版本是1.0.4479.26553,所以我希望我的功能能够自动找到类似编号的程序集版本.我怎样才能做到这一点?
我有点天真地试过这样的事情:
ReceiverAssembly="HappyFeature, Version=1.0.*, Culture=neutral, PublicKeyToken=d772fbab82fe6896"
Run Code Online (Sandbox Code Playgroud)
和
ReceiverAssembly="HappyFeature, Version=1.0.*.*, Culture=neutral, PublicKeyToken=d772fbab82fe6896"
Run Code Online (Sandbox Code Playgroud)
但是当我尝试部署我的解决方案时,它似乎仍然在寻找1.0.0.0版本的文件:
功能"7b5d86e8-17dc-4943-8f4e-ad1068daf4f9"无法安装,因为事件接收器组件的装载"HappyFeature,版本= 1.0 .,文化=中性公钥= d772fbab82fe6896"失败:System.IO.FileNotFoundException:未能加载文件或程序集'HappyFeature,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = d772fbab82fe6896'或其依赖项之一.该系统找不到指定的文件.文件名:'HappyFeature,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = d772fbab82fe6896'
强制框架加载增量版本功能组件的正确方法是什么?
编辑:所以,虽然我没有真正解决我问过的具体问题,但Ryan的建议解决了我的实际问题,即能够使用SVN相关信息标记我的程序集,同时保留在SharePoint中成功加载程序集的能力FeatureReceiver世界.
由于缺少程序集,项目将无法编译.导致错误的文件有
using Microsoft.VisualStudio.DebuggerVisualizers;
Run Code Online (Sandbox Code Playgroud)
该VisualStudio部分被标记为红色.我需要安装什么来修复它?对我而言,这听起来像是Visual Studio带来的东西,但这就是我正在使用的东西,所以它被安装......
澄清:我知道它存在于哪个程序集中,并且引用会在之前添加到项目引用中.但我怎么得到它?我需要安装什么SDK?或者我忘记在安装Visual Studio时检查一些东西?
在运行时,如果引用的程序集无法加载,例如"强名称验证失败"(因为它是经过测试签名的),是否有办法从另一个实际签名的路径提供替换程序集?
我尝试订阅AppDomain.CurrentDomain.AssemblyResolve,但它没有被触发,因为"坏"程序集技术上存在,它只是无法加载.
在无法加载程序集时,是否存在提供回退程序集的通用方法?
在.NET融合记录器(FUSLOGVW.exe)中,屏幕右下方的两个选项有什么作用?
Log Categories
+ Default
+ Native Images
Run Code Online (Sandbox Code Playgroud)
我如何使用其中任何一个来诊断混合模式装配问题?
我有一个WPF应用程序,我订阅了事件AppDomain.AssemblyResolve(每当运行时找不到程序集时都会引发此事件),并且我注意到它会多次尝试解析MyAssembly.resources,其中MyAssembly是当前的执行装配.它还对我从MyAssembly引用的库程序集问了同样的事情(它要求Library.resources).
这是正常的吗?我如何解决它?我的应用确实有问题.它无法加载位于库中的某些xaml用户控件.这有关系吗?
我正在开发一个引用并使用来自某个供应商的某些第三方程序集的应用程序; 在开发框中我在源代码树的参考文件夹中有这3个程序集,我可以引用它们并构建应用程序,应用程序构建但不运行,因为没有安装整个服务器应用程序,但这很好.
在我想要复制此自定义应用程序并运行我引用的所有程序集的服务器上的文件夹类似于:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
Run Code Online (Sandbox Code Playgroud)
如果我在该文件夹中复制我的小可执行文件并运行它,它可以正常工作,但如果我把我的.exe放在一个更合适的文件夹中,就像我想要的那样:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为它无法解析这些程序集.
我知道我可以在app.config中使用探测来指定我的exe必须查找引用的文件夹,但imy情况下程序集不在子文件夹中,更多在完全不同的位置.
我不想复制我的应用程序文件夹中的所有供应商程序集,我不能只放在那里我引用的3个,因为他们也加载其他程序集,除非我拥有所有这些(很多......),它不会工作.
我没有做任何特别的事情,没有创建应用程序域而不是通过反射加载程序集,只是希望CLR在应用程序启动或执行时需要解析引用.
谢谢.
编辑:这里是最终的工作代码
static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();
try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];
Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
AssemblyName myAssemblyName = Array.Find<AssemblyName>(arrReferencedAssmbNames, a => a.Name == args.Name);
if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly …Run Code Online (Sandbox Code Playgroud) 我刚刚在我的项目中升级了log4net,并且遇到了一些程序集绑定问题,因为一个组件依赖于旧版本的log4net.
该组件预期的版本是
log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821
Run Code Online (Sandbox Code Playgroud)
我的版本是
log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
Run Code Online (Sandbox Code Playgroud)
如何正确解析此绑定(只有一个api差异,此组件无关紧要).
我已经尝试将以下内容添加到我的web.config但它不起作用.
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
<bindingRedirect oldVersion="1.2.10.0" newVersion="1.2.12.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud) .net assembly-resolution .net-assembly assembly-binding-redirect
我需要引用一个有两个版本的DLL(一个用于32位,一个用于64位).我的目标是构建一个适用于32位和64位系统的Web应用程序.
我考虑默认引用32位程序集并使用AssemblyResolve事件加载64位版本(如果加载32位版本失败):
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve;
// Try LoadAssembly ...
}
static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args)
{
var path = string.Format(@"...\lib_x64\{0}.dll", args.Name);
return Assembly.LoadFrom(path);
}
Run Code Online (Sandbox Code Playgroud)
但即使发生BadImageFormatException,也不会调用_AssemblyResolve处理程序.有没有其他方法来实现建议的行为?
这个问题涉及 .NET 5+,而不是 .NET Framework。
考虑以下依赖树:
MyWebsiteRandomWebLibrary有对1.0.0 和2.0.0的包引用RandomJsonLibrary。RandomWebLibrary1.0.0 具有对 1.0.0 的包引用RandomJsonLibrary。RandomJsonLibrary没有依赖项。我的问题:
RandomJsonLibrary运行时将加载什么版本?RandomJsonLibrary如果2.0.0 的 API 与RandomJsonLibrary1.0.0完全不同会发生什么?MyWebsite存在多个版本而引起的问题吗?RandomJsonLibrary.NET 5+ 中是否存在与 .NET Framework 绑定重定向等效的功能?我是出于好奇才问的,而不是因为我遇到了问题。作为参考,这里是关于Understanding AssemblyLoadContext 的文档,它似乎相关,但没有回答我的问题。
.net ×6
c# ×3
.net-5 ×1
asp.net ×1
assemblies ×1
clr ×1
deployment ×1
fusion ×1
nuget ×1
reflection ×1
resources ×1
sharepoint ×1
wpf ×1
wsp ×1