C# 如何在C中查找错误的程序集引用#

C# 如何在C中查找错误的程序集引用#,c#,azure,C#,Azure,我很难找到C#/Azure应用程序中出现错误程序集引用问题的原因。我要找的不是有人告诉我问题的确切解决方案,而是如何找到系统试图加载的程序集以及如何找到它为什么这样做 问题是在升级Azure工具时出现的。真正奇怪的是,只有当我试图通过实体框架调用数据库函数时才会发生错误(据我所知)。EF完成了所有这些隐式程序集加载,以及它如何变得混乱,并试图加载Microsoft.ServiceBus 1.8.0.0(或正在查找该程序集),而不是2.2.0.0版 我们使用的是实体框架4.0。仅供参考,我们可以调

我很难找到C#/Azure应用程序中出现错误程序集引用问题的原因。我要找的不是有人告诉我问题的确切解决方案,而是如何找到系统试图加载的程序集以及如何找到它为什么这样做

问题是在升级Azure工具时出现的。真正奇怪的是,只有当我试图通过实体框架调用数据库函数时才会发生错误(据我所知)。EF完成了所有这些隐式程序集加载,以及它如何变得混乱,并试图加载Microsoft.ServiceBus 1.8.0.0(或正在查找该程序集),而不是2.2.0.0版

我们使用的是实体框架4.0。仅供参考,我们可以调用存储过程并进行其他类型的查询。只有db函数调用才会导致此特定问题

我在我的应用程序中到处搜索,找不到对1.8.0.0的引用,也找不到零散的1.8.0.0 DLL。我们可能有一个过时的参考文献,指向某个第三方库,该库保留了对1.8.0.0的参考文献,但我认为这不太可能

尽管如此,我的目标不是让某人告诉我X是我的问题,而是让我知道如何监视实体框架,并找出它为什么试图加载该程序集,以及它期望找到什么和它实际发现什么

这是我的全部记录


无法加载文件或程序集“Microsoft.ServiceBus,版本=1.8.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x8013100) 在System.Reflection.RuntimeAssembly.\n加载(AssemblyName文件名、字符串代码基、证据assemblySecurity、RuntimeAssembly位置提示、StackScrawMark和stackMark、IntPtr pPrivHostBinder、Boolean throwOnFileNotFound、Boolean for Inspection、Boolean suppressSecurityChecks) 位于System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据assemblySecurity,RuntimeAssembly reqAssembly,StackScrawMark&stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean For Inspection,Boolean suppressSecurityChecks) 在System.Reflection.Assembly.Load处(AssemblyName assemblyRef) 位于System.Data.Metadata.Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName AssemblyName) 在System.Data.Metadata.Edm.MetadataAssemblyHelper.d_u0.MoveNext()中 位于System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(程序集程序集、布尔加载引用程序集、ObjectItemLoadingSessionData加载数据) 位于System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(程序集程序集、布尔加载引用程序集、ObjectItemLoadingSessionData加载数据) 位于System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(程序集程序集、布尔加载引用程序集、ObjectItemLoadingSessionData加载数据) 位于System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(程序集程序集、布尔加载引用程序集、ObjectItemLoadingSessionData加载数据) 位于System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(程序集程序集、布尔LoadReferenceAssembly、KnownAssembliesSet knownAssemblies、EdmItemCollection EdmItemCollection、Action`1 logLoadMessage、Object&loaderCookie、Dictionary`2和typesInLoading、List`1和errors) 位于System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection ObjectItemCollection,程序集,布尔LoadReferenceAssemblys,EdmItemCollection EdmItemCollection,操作'1 logLoadMessage) 位于System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadAllReferencedAssembly(程序集程序集,EdmItemCollection EdmItemCollection) 位于System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(类型类型,程序集调用Assembly) 位于System.Data.Objects.ObjectContext.CreateQuery[T](字符串查询字符串,ObjectParameter[]参数) 在c:\Users\RMacgrogan\dev\FlightBridge\BaseOps\trunk\FB Version 7.8\code\InternalServices\Data\Model\FlightBridgeDataModel.Designer.cs中的Pallas.FlightBridge.Services.Internal.Model.FlightBridgeDatabaseContext.TripPermissions(可为null`1 companyPersonId):第3778行 在c:\Users\RMacgrogan\dev\FlightBridge\BaseOps\trunk\FB Version 7.8\code\InternalServices\Data\Repository\TripRepository.cs第50行中的Pallas.FlightBridge.Services.Internal.Data.Repository.TripRepository.GetTripAndOrsandTravelers(Int32 tripId,Int32 companyPersonId)中
在azure工具升级之后,我们遇到了类似的问题。对于我们,它正在寻找不同版本的Microsoft.WindowsAzure.Storage。这为我们解决了问题。这是来自工作角色的app.config,但同一节在web.config中也有效:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

因此,对于您来说,在有问题的角色的配置文件中似乎需要类似的绑定重定向。大概是这样的:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.ServiceBus" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

为什么会发生这种情况

当Microsoft构建这些库(如EF、WindowsAzure存储等)时,它们依赖于其他库。在构建dll时,它们可能依赖于例如Microsoft.ServiceBus之类的库的1.8版。通常,这些依赖项是.NET framework的一部分,或者类似于Azure SDK的内容

后来,他们推出了这些库的更新版本。您的项目可能依赖于较新版本的.NET framework、Azure SDK或特定库,其版本与原始库的依赖项不同,例如2.2而不是1.8。有问题的库(EF)查找它编译时所针对的版本(1.8),并抛出一个异常,即使您有一个新版本的dll(2.2),它可以很好地使用它。解决方案是使用bin配置应用程序