Tuesday, April 15, 2014

SOLVING - Could not load file or assembly or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

This is quite possibly one of the most frustrating errors you can get after upgrading a Nuget package in an Asp.Net MVC project. If this is the first time you are getting it, you are likely wondering what is and where is the assembly's manifest. Well fear not mighty soldier developers because I have the information that will help you get running in no time. First an explanation.

When you update an existing Nuget package, that update often has side effects. What does that mean? Well the packages you need often depend on other packages and when you run the Nuget update, the package you need might pull in updates to the packages IT needs even though you didn't specify that you wanted those other packages updated. That was a  mouthful! The dependencies being updated are side effects that you may or may not have planned for. On the surface, this seems like it might be OK. As long as the update happens to the files you need and things still build, you are fine. However, this isn't always the case. I'm going to run through what happens when an update happens.

For this example, I'm going to say we are updating Package A.
  1. Package A depends on Packages K, L and M.
  2. You already have a version of Packages K, L and M installed on your machine.
  3. Package A needs to upgrade Packages K, L and M BEFORE it can install itself.
  4. Package M is needed by Package R so it can't be uninstalled unless Package R is uninstalled.
  5. The update  uninstalls Package R, Package M, Package L and Package K and then installs the newer versions of each package it relies on and the version of Package R that works with Package M. 
  6. After the new versions of the dependencies have all been installed, Package A installs the latest version of itself.
  7. The package.config file is updated to include the version information for the newly installed files.
  8. The dependentAssembly area in the web.config file is updated to include dependency information and establish the backward capability of the newly updated files.

That is a lot! It is no wonder then that subtle side effects (aka hidden problems) can arise during that process. It is involved! If everything runs smoothly, all of the references are updated accordingly and all is right with the world. However, nothing ever runs smoothly does it?

Sometimes, due to all of the installing and uninstalling that takes place, the web.config file does NOT get updated by the Nuget Package you are running! This is where we run into errors like -

Could not load file or assembly 'Whatever.File' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Basically what this error SHOULD say is, "The web.config and package.config files do not match what is in the References folder"! There you have it - I have just rewritten a Microsoft error into something that a developer can actually understand? Did hell freeze over? Anyway, THAT is the problem. Sometimes when these packages uninstall and reinstall dependent packages, they do NOT update the packages.cofig and web.config accordingly. If the web.config references a version of the package that no longer exists, you  are going to get the "Could not load file or assembly...blah...blah....blah" error! So how do we solve this issue? The solution is easy.

  1. First, identify the file that the system is complaining about. It should be easy to do since the error message will list the file. For example, in the error below, Microsoft.Owin.Security.OAuth is the culprit. Could not load file or assembly 'Microsoft.Owin.Security.OAuth' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
  2. Second, go the References folder in your project and look for the file specified. When you find it, right click on it and select Properties (Alt-Enter) and look at the Version. Make a note of it. This is the actual version that is installed on your system.
  3. Third, go to the packages.config file and find the file. Check to see that the version number for the file listed in the packages.config matches the version you have specified in your References folder. 
  4. Fourth, check the web.config dependentassembly area for the file. The bindingDirect  areas has an oldVersion and newVersion area. The oldVersion area should end with a version number that is EQUAL to the version number you have installed and the newVersion number should MATCH what you have installed. For example, if you have version 5.0 of System.Web.Mvc, then your dependentAssembly and associated bindingRedirect should look like the following - 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
 

    </assemblyBinding>

 After you are done, clean and rebuild your project!
 Smile :-). Either your project built successfully and you can see your stuff or you have to repeat the steps above for another file until they have all been corrected.

Notice the highlighted areas. The newVersion is what is installed on your system. The oldVersion represents all of the versions the newVersion should be able to handle. If this web.config information is out of sync with the version information in your packages file and in your project, then you will get an error.

Please note - sometimes you have to manually change MORE than just one file to get things running. I have one project in which I had to update 5 references from different packages. Each situation will be different. If you get another file error, correct that one and keep going until you get a clean build and can run your project.

If you want, you can run the Nuget Package Manager and update the one package that is giving you an issue. However, sometimes that is not the best approach if that package  has dependent relationships. You can end up in what I call "Package DLL Hell" - where one package updates another package and each update keeps causing other side effects! Hey - wasn't this what we were supposed to be SAVED from using Nuget? LOL.....anywho....following the steps above will get you going!

Smooches,

Kila Morton







Friday, March 21, 2014

Solving System.InvalidCastException was unhandled by user code Message=[A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast ......

Recently, while upgrading an Asp.Net MVC 4 project someone created to an Asp.Net MVC 5 project, I ran across a great error. The error was this:

It was also bright and red!


Server Error in '/' Application.

[A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Type B originates from 'System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bc28c2e0\1b833c84\assembly\dl3\efd960b2\2bccde4f_7f44cf01\System.Web.WebPages.Razor.dll'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Type B originates from 'System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bc28c2e0\1b833c84\assembly\dl3\efd960b2\2bccde4f_7f44cf01\System.Web.WebPages.Razor.dll'.

This error made me VERY unhappy.
However, the solution was VERY simple.
I just needed to tell the application which version to use.
Here are the steps I took.


1. Open the web.config file.
2. Scroll until you find the <assemblybinding> tag under <runtime>.
3. Add in the following dependent assembly information for the dll that is causing you problems. In my case, it was as follows:

<dependentAssembly>

<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="2.0.0.0" newVersion="3.0.0.0"/>

</dependentAssembly>

4. Rebuild your project!

That is it! You should now see the fantastic work you have created after you build and Ctrl-F5. For all of you people out there still making projects with MVC 4 - JUST STOP! Back away slowly! MVC 5 is your friend!

Smooches,
Kila Morton

Wednesday, February 26, 2014

Solving "The term 'mongod' is not recognized as the name of a cmdlet, function, script file, or operable program.

Recently, while attempting to install an instance of MongoDB on a Windows Azure VM, I got a nice error.

mongod : The term 'mongod' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

I was in the bin directory of MongoDB at the command prompt and trying to run the database with the following statement -
mongod  --dbpath c:\MongoData\ --logpath C:\MongoLogs\mongolog.db

Ha! I forgot the .\!
mongod  --dbpath c:\MongoData\ --logpath C:\MongoLogs\mongolog.db

should have been
.\mongod  --dbpath c:\MongoData\ --logpath C:\MongoLogs\mongolog.db

I'm adding this here just in case anyone else is spacing out on a Wednesday wondering what in the world is going on when they are trying to run their Mongo databases.

Smooches,

Kila

Thursday, February 20, 2014

Solving System.Web.Http.GlobalConfiguration' does not contain a definition for 'Configure

When upgrading your fantastic Asp.Net Web Api projects to version 2.0, you might come across this wonderful error -

System.Web.Http.GlobalConfiguration' does not contain a definition for 'Configure 
on this line of code -
GlobalConfiguration.Configure(WebApiConfig.Register);

The solution is quick and simple.

1. Open the Package Manager Console for the project with the error.
2. Type in Install-Package Microsoft.AspNet.WebApi.WebHost and hit Enter
3. Rebuild your project and all should be right with the world (or at least right with your project)


Smooches,
Kila



Wednesday, January 8, 2014

How To Remove The "Switch between apps" window In Windows 8.1

Hi! I've just been using a Windows 8.1 machine and losing my mind. I vowed never to use it until it was better designed (usually around Microsoft's 3rd or 4th attempt) after the very first frustrating experience I had with Windows 8, but I had to backtrack on that to test a piece of software I'm working on. I have noticed that although Windows 8.1 is slightly different, Microsoft has decided to maintain the interface from hell. I don't know why Microsoft thinks that people want to invest time in learning a new operating system when they have things to do.

The new rub for me now with Windows 8.1 was the right side Switch between apps menu that didn't want to disappear. I moved my mouse all over that little thing to get it to leave. It wouldn't. I switched to a different app and it popped up on the left side. I was starting to get annoyed. I moved my mouse over it, pressed Esc and laughed as it sat there on the screen mocking me. Finally, I decided to probe it with my mouse. It won't go anywhere if you just put your mouse over it. You actually have to put your mouse into the far left corner (if it popped up on the left) or the far right corner (if it popped up on the right) for it to go away. That is the dumbest thing I have ever seen in my life! 

Microsoft is a company with many brilliant people. They come up with great things from time to time. Windows 8 and Windows 8.1 should NOT be included as one of those great things. A few months back, I was on the Microsoft campus to do some testing for a Visual Studio add-in. Basically, they put you in a room and have you test out a product while you provide feedback. How on EARTH, did Windows 8 make it through that process? I don't understand. The product is COMPLETELY counter-intuitive for an operating system. I don't want a phone experience on my laptop! When I sit down to work, I don't want to perform unnatural movements to get things done. Do you know how much effort it takes to move my arm to touch my screen versus moving my wrist SLIGHTLY with my mouse to move something on the screen? I don't want to swipe and figure it out. In fact, I don't even like fingers ON my screen! I'm not alone! I also hate trying to figure out what something does. I like words - Open, Close, etc. I am against the idea of prearranged desktop icons. When I add a program to my computer and it adds an icon, I feel connected to that program and it's placement on the desktop because I ADDED IT. When I open Windows 8 and all of this crap is already staring at me, it just FEELS wrong because I didn't add that crap. I REALLY don't like the colors and styling of the interface either. I think it looks immature and cluttered. It may sound silly, but the way you set your computer up is an extension of you. Microsoft made the bet that people wanted a phone like experience across all devices. They were wrong. I have Windows 7 on every machine I do real business with. I have Windows 8 for those times when I need to make sure something I've created works on it. However, I have NO intention of upgrading unless I am absolutely forced to do so. NO INTENTION! I couldn't even imagine a system like Windows 8, with that horrible Metro interface, being used in an enterprise environment where people have to get things done quickly. You just don't have time to figure out why the pages keep swapping over each other when you are trying to get real work done. Windows 8 has been out for some time now and it has a very small adoption rate. I actually know people who purchased a Windows 8 laptop and then installed Windows 7 on it! What does that tell you?

I would love it if Microsoft gave users a CHOICE - stick with the dumb as rocks Metro interface OR use the Classic Windows 7 interface! They would really get to see how many people thought Windows 7 was just fine. Windows 8 wasn't an improvement over a design that was broken. It just wasn't. If they had focused more on the cloud and integration with your other devices and LESS on radically altering the entire interface, Windows 8 would have been a smashing success. Instead, just like with the ribbon in Office that sent me and others right into the arms of Google Docs and Open Office, they focused on styling TOO MUCH! Who made that choice? I bet it wasn't a real developer. It seems like something a marketing person would have thought of. Either way, I think it is just plain crazy. History may show me to be totally wrong, but given the fact that Windows 7 usage is still mighty high, I don't think so.

Anywho, to remove that annoying Switch between apps menu, just put your mouse in the nearest corner! Why didn't Microsoft make a little close icon on the pop-up? Counter-intuitive Microsoft - simply counter-intuitive.
This ends my rant for the day.

Smooches,
Kila

***********************************************************

Problem:
The "Switch between apps" pop up in Windows 8.1 will not go away.

Solution:
Put your mouse into the corner of the pop up and it will disappear. If the pop up is in the far right corner, put your mouse into the top right corner of the pop up and it should disappear. If the pop up is in the far left, put your mouse into the top left corner and it should disappear. After you finish getting rid of that, go get a breath of fresh air.


Thursday, December 19, 2013

How To Find Stereo Mix On Windows 7- How To Enable Stereo Mix With Conexant


I like to use Audacity to record things off of the Internet sometimes. However, to get a clean recording, you need to be able to use the Stereo Mix feature on your audio device. If you have certain Conexant audio devices, you  may not be able to use the Stereo Mix feature. According to some reports, computer makers, like Sony Corporation, asked Conexant to disable the Stereo Mix feature to stop people from recording things off of the Internet that might violate a copyright. Well, no matter the reason, I'm here to show you how to enable Stereo Mix on your Conexant device. Make sure you do the right things with this power.

First we are going to make sure you don't have Stereo Mix on your machine already. If you are technically savvy and are completely sure you don't have it, then you can skip this step.


  1. In the lower left hand of your task bar, right click on the speaker icon.
  2. Select Recording devices. 
  3. Right click in the blank white space and select Show Disabled Devices and Show Disconnected Devices.
  4. If you don't see Stereo Mix, like the photo below shows, then you need to follow the second set of directions.




******************************************************************************
OK. Now we are going to add Stereo Mix. It once was lost, but now it will be found! Ready?

  1. Go to your start menu and type Regedit. We are going to edit your Registry. Once the software comes up, click on Regedit. 
  2. Once you have Regedit open, you are going to go to HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Control\Class\{4D36E96C-E325-11CE-BFC1-08002BE10318}\0000\Settings\EPattributes.
  3. Once you get to the EPattributes node, you are going to check and see if you have the EpSettings node. If you HAVE this node, move on to the next step. If you DO NOT have the EpSettings node, you will need to add it by right clicking on the EPattributes node and selecting New and then Key. Enter EpSettings.
  4. After you have either added EpSettings or verified that you have it, you are now going to add a key to EpSettings by right clicking on EpSettings, selecting New and then Key and creating a key named StereoMixEnable.
  5. After it has been created, right click on StereoMixEnable, click New and then Binary Value to create a Binary Value called Enable
  6. Change the value for Enable to 1 or 01 if you can't just put the 1 in.
  7. Right Click on StereoMixEnable again, click New and then Binary Value to create a Binary Value named MixAssocSeq.
  8. Change the value of MixAssocSeq to e0 e0
  9. Right Click on StereoMixEnable again, click New and then Binary Value to create a Binary Value named MuteGainSettings.
  10. Change the value of MuteGainSettings to 00 00.
  11. Now close Regedit and restart your computer.
  12. After your computer restarts, go to Control Panel, Sound and then click Recording tab and you will see Stereo Mix. It will be disabled.
  13. Right click Stereo Mix and enable it.
  14. Set it as the default device.
Now you can use Stereo Mix to record sounds from the Internet directly into your computer using something like Audacity.

If you have problems or questions, just ask!

Smooches!
Kila Morton

Problem:
You do not see Stereo Mix on your laptop or PC and you have a Conexant device.

Solution:
You must alter the registry settings, restart your machine and enable Stereo Mix.

Saturday, August 3, 2013

How To Solve The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster. Error In Asp.Net MVC!


The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the <machineKey> configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster.

Isn't that a beautiful error? Recently, while working on a website I created in Asp.Net MVC 4, I got this error. How you ask? I'm so glad you asked! The website is hosted right now and I am developing it on my local development machine and pushing the changes to the actual website. From time to time, I leave my computer and leave the website up. There have been times when I was logged into the website, walked away, came back after the session timed out and clicked on a link on the site only to have the site route me to the sign in page. That is the expected behavior. What isn't expected, is that when I try to sign in I get this beautiful error -

The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the <machineKey> configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster.

Now WHY do I think this is a beautiful error? Well unlike some errors you get while developing, this error actually means EXACTLY what it says! I am using the Antiforgery token system in Mvc. You call that using this syntax @Html.Antiforgery(). When you use this system straight out of the box, the encryption and validation keys are auto-generated at runtime for you. That is great - until the session terminates. At that point, the system loses a reference to those auto-generated keys. Then, when you are kicked out of the system and have to come back, it still has a reference to the old keys, but those are not usable anymore - since the system generated new ones for your new session. All of a sudden, the new one the system generated and the old one your page is referencing are not in sync and you get the error.

So what can you do? The answer is simple - follow directions and generate the keys in your web.config file! Add the following to your site's web.config file.

<configuration>
  <system.web>
    <machineKey decryptionKey="Decryption key goes here, IsolateApps"
                validationKey="Validation key goes here, IsolateApps" />
  </system.web>
</configuration>
You can generate keys by going into IIS and clicking on Machine Key - if you have the right version and IIS features installed. You will not see Machine Key if you don't. If you don't, you can go to the Control Panel and install additional IIS features. Then, paste those keys into the code above. That will allow the Antiforgery system to work off of those instead of autogenerating.

Problem solved!
I just love it when a plan comes together! Don't you?

Smooches,

Kila Morton