I developed a farm solution with feature receivers for SharePoint 2013. The assembly deployment target is “WebApplication” (not “GlobalAssemblyCache”)
Development:
- Farm Solution for SharePoint 2013 (also 2007 and 2010)
- Assembly Deployment Target: WebApplication
- Feature Receivers
- FeatureActivated
- FeatureDeactivating
Problem:
I got an error message if I tried to enable the feature using PowerShell script. The same issue is also for disabling feature.
Error message:
PS C:\Users\Administrator> Enable-SPFeature -identity “…_RootLandingPage” -URL http://sharepoint2013/organization/navi_Replace
Enable-SPFeature : Failed to load receiver assembly “….Variations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=…” for feature
“….Variations_RootLandingPage” (ID:…).: System.IO.FileNotFoundException: Could not load file or assembly ‘…Variations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=…’ or one of its dependencies. The system cannot find the file specified. File name: ‘…Variations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=….’ at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName
assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,
Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString) at
Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject() WRN: Assembly binding logging is turned OFF. To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1. Note: There is some performance penalty associated with assembly bind failure logging. To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog]. At line:1 char:1 + Enable-SPFeature -identity “…Variations_RootLandingPage” -URL http://sha …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Share…etEnableFeature: SPCmdletEnableFeature)
[Enable-SPFeature], ArgumentException
+ FullyQualifiedErrorId : Microsoft.SharePoint.PowerShell.SPCmdletEnableFeature
Cause:
The dll-file from the farm solution is not a global assembly, because it deploys to web application. This file is available in the folder for instance: C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin.
By default, PowerShell script looks the DLL-file in the GAC, instead of in the CAS.
Solution:
I think there are two possibilities to solve this issue.
- Load right assembly
I didn’t try it because it loads a DLL-file and is not always on the same path. The script should run in all environments - Use client-side SharePoint API
Yeah, it works. I only need both DLL-files (Microsoft.SharePoint.Client and Microsoft.SharePoint.Client.Runtime). The PowerShell script can enable and disable the feature. You can copy the code below.