Error message 'Unable to load one or more of t

2019-01-01 07:59发布

问题:

I have developed an application using Entity Framework, SQL Server 2000, Visual Studio 2008 and Enterprise Library.

It works absolutely fine locally, but when I deploy the project to our test environment, I am getting the following error:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information

Stack trace: at System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)

at System.Reflection.Assembly.GetTypes()

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContext context)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContext context)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(Assembly assembly, Boolean loadReferencedAssemblies, Dictionary2 knownAssemblies, Dictionary2& typesInLoading, List`1& errors)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType(Type type)

at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(Type type, Assembly callingAssembly)

at System.Data.Objects.ObjectContext.CreateQuery[T](String queryString, ObjectParameter[] parameters)

Entity Framework seems to have issue, any clue how to fix it?

回答1:

I solved this issue by setting the Copy Local attribute of my project\'s references to true.



回答2:

This error has no true magic bullet answer. The key is to have all the information to understand the problem. Most likely a dynamically loaded assembly is missing a referenced assembly. That assembly needs to be in the bin directory of your application.

Use this code to determine what is missing.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine(\"Fusion Log:\");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}


回答3:

One solution that worked for me was to delete the bin/ and obj/ folders and rebuild the solution.



回答4:

Two possible solutions:

  1. You are compiling in Release mode but deploying an older compiled version from your Debug directory (or vise versa).
  2. You don\'t have the correct version of the .NET Framework installed in your test environment.


回答5:

As it has been mentioned before, it\'s usually the case of an assembly not being there.

To know exactly what assembly you\'re missing, attach your debugger, set a breakpoint and when you see the exception object, drill down to the \'LoaderExceptions\' property. The missing assembly should be there.

Hope it helps!



回答6:

I encountered this error with an ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4 application.

It would work fine on my development machine (Windows Vista 64-bit). Then when deployed to the server (Windows Server 2008 R2 SP1), it would work until the session timed out. So we\'d deploy the application and everything looked fine and then leave it for more than the 20 minute session timeout and then this error would be thrown.

To solve it, I used this code on Ken Cox\'s blog to retrieve the LoaderExceptions property.

For my situation the missing DLL was Microsoft.ReportViewer.ProcessingObjectModel (version 10). This DLL needs to be installed in the GAC of the machine the application runs on. You can find it in the Microsoft Report Viewer 2010 Redistributable Package available on the Microsoft download site.



回答7:

Make sure you allow 32 bits applications on IIS if you did deploy to IIS. You can define this on the settings of your current Application Pool.



回答8:

If you\'re using the EntityDataSource in your project, the solution is in Fix: \'Unable to load one or more of the requested types\' Errors. You should set the ContextTypeName=\"ProjectNameNameSpace.EntityContainerName\" \'

This solved my problems...



回答9:

Initially I tried the Fusion log viewer, but that didn\'t help so I ended up using WinDbg with the SOS extension.

!dumpheap -stat -type Exception /D

Then I examined the FileNotFoundExceptions. The message in the exception contained the name of the DLL that wasn\'t loading.

N.B., the /D give you hyperlinked results, so click on the link in the summary for FileNotFoundException. That will bring up a list of the exceptions. Then click on the link for one of the exceptions. That will !dumpobject that exceptions. Then you should just be able to click on the link for Message in the exception object, and you\'ll see the text.



回答10:

Another solution to know why exactly nothing works (from Microsoft connect):

  1. Add this code to the project:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
    
  2. Turn off generation serialization assemblies.

  3. Build and execute.


回答11:

The solution was to check the LoaderException: In my case, some of the DLL files were missing.

\"Enter



回答12:

My instance of this problem ended up being a missing reference. An assembly was referred to in the app.config but didn\'t have a reference in the project.



回答13:

Adding my specific problem/solution to this as this is the first result for this error message. In my case, the error was received when I deployed a second application within the folder of my first application in IIS. Both were defining connection string with the same name resulting in the child application having a conflict and in turn generating this (to me) non-obvious error message. It was solved by adding:

<clear/>

in the connection string block of the child web application which prevented it from inheriting the connection strings of web.config files higher in the hierarchy, so it looks like:

<connectionStrings>
  <clear/>
  <add name=\"DbContext\" connectionString=\"MySERVER\" providerName=\"System.Data.SqlClient\" />
</connectionStrings>

A reference Stack Overflow question which helped once I determined what was going on was Will a child application inherit from its parent web.config?.



回答14:

This worked for me. Add it in your web.config

<system.web>
  <trust level=\"Full\" />


回答15:

In case none of the other answers help you:

When I had this problem, it turned out my Windows service was built for an x64 platform, and I was inadvertently running the 32-bit version of InstallUtil.exe. So make sure you\'re using the right version of InstallUtil for the platform you built for.



回答16:

I had a .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 web application developed in Visual Studio 2010. I had the same problem, that it worked on one Windows Server 2008 R2 server but not on another Windows Server 2008 R2 server, even though the versions of .NET and ASP.NET MVC were the same, throwing this same error as yours.

I went to follow miko\'s suggestion, so I installed Windows SDK v7.1 (x64) on the failing server, so I could run !dumpheap.

Well, it turns out that installing Windows SDK v7.1 (x64) resolved the issue. Whatever dependency was missing must have been included in the SDK. It can be downloaded from Microsoft Windows SDK for Windows 7 and .NET Framework 4.



回答17:

If you are using Entity Framework, try copying the following references locally.

  • System.Data.Entity
  • System.Web.Entity

Change the property \"Copy Local\" to \"True\" for these references and publish.



回答18:

Other suggestions are all good. In my case, the problem was that the developer box was a 64-bit machine using the x86 location of various APIs, including Silverlight.

By changing the target platform to match the 32-bit server where the web application was being deployed removed the majority of the errors related to not being able to load one or more of the requested types.



回答19:

I changed the Specific Version Property of the Refrences to false and that helped.



回答20:

I had the same issue (but on my local) when I was trying to add Entity Framework migration with Package Manager Console.

The way I solved it was by creating a console application where Main() had the following code:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

Make sure the Configuration class is the migration Configuration of your failing project. You will need System.Data.Entity.Migrations to use DbMigrator.

Set a breakpoint in your application, and run it. The exception should be caught by Visual Studio (unless you have that exception type set to not break the debug session), and you should be able to find the info you are looking for.

The missing reference in my case was EFProviderWrapperToolkit.



回答21:

I got this problem when I installed a NuGet package on one of the projects and forgot to update the other project.

I solved this by just making both projects having the same reference assembly.



回答22:

My issue has been resolved after I deleted the redundant assembly files from the bin folder.



回答23:

It happened for me also. I solved the problem as follows: Right click Solution, Manage NuGet Packages for Solution... Consolidate packages and upgraded the packages to be in the same version.



回答24:

Set 32 bit IIS mode to true, debug mode to true in the configuration file, deleting the temp directory and resetting IIS fixes the issue temporally and it comes back after some time.



回答25:

Verify that each of your projects is setup correctly in the Configuration Manager.

Similar to William Edmondson\'s reason for this issue, I switched my Configuration Manager setting from \"Debug\" \"Any CPU\" to \"Debug\" \".NET\". The problem was that the \".NET\" version was NOT configured to build ALL of the projects, so some of my DLLs were out of date (while others were current). This caused numerous problems with starting the application.

The temporary fix was to do Kenny Eliasson\'s suggestion to clean out the \\bin and \\obj directories. However, as soon as I made more changes to the non-compiling projects, everything would fail again.



回答26:

I also got this issue when create new Microsoft Word add-in with Visual Studio 2015. The issue is about I have 2 versions of MS Office, 2013 and 2016. I uninstall MS Office 2013 and then it works.



回答27:

I build a few projects for SharePoint and, of course, deployed them. One time it happened.

I found an old assembly in C:\\Windows\\assembly\\temp\\xxx (with FarManager), removed it after reboot, and all projects built.

I have question for MSBuild, because in project assemblies linked like projects and every assembly is marked \"Copy local\", but not from the GAC.



回答28:

I had the same error message reported when compiling a Visual Studio package (VSPackage). The whole solution compiles and the error is thrown when the package is being created by CreatePkgDef. Having said that, it is clear that I cannot catch the LoaderExceptions as it is not my application that throws it, but Microsoft\'s own tool. (Though I am responsible for the confusion of CreatePkgDef.)

In my case the root cause was that my solution creates a MyDll.dll that has already been registered to the GAC (and they are different), so the CreatePgkDef got confused which one to use and it decided just to throw an error which isn\'t really helpful. The MyDll.dll in the GAC was registered by the installer of the same product (obviously an earlier version, with /slightly/ different content).

How to fix it

  1. Preferred way: Make sure you use the correct version of MyDll.dll
    1. When compiling your project make sure you use a different version number than you used in the previous version located in the GAC. Make sure the following attributes are correct:
      • [assembly: AssemblyVersion(\"1.0.0.1\")] // Assuming the old DLL file was versioned 1.0.0.0
      • [assembly: AssemblyFileVersion(\"1.0.0.1\")] // Assuming the old DLL file was versioned 1.0.0.0
    2. If needed, specify the fully qualified assembly name (for example, \"MyDll.dll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=1234567890abcdef\") when you reference it in your other projects.
  2. If the above failed: You can uninstall the old MyDll.dll from GAC
    1. How to Uninstall an Assembly from the GAC
    2. Uninstall the application that includes MyDll.dll

Changing the AssemblyVersion was good enough for me. :)

I hope this was helpful.



回答29:

I am able to fix this issue by marking \"Copy Local=True\" on all referenced DLL files in the project, rebuilding and deploying on a testing server.



回答30:

I had an issue with automap. In the bin folder, the file automap.4net.dll was there, but for some reason the automap.xml and automap.dll weren\'t. Copying them to the bin directory solved the issue.