2012-05-24 40 views
5

Tôi đã viết một ứng dụng C# khá phức tạp để truy cập cơ sở dữ liệu oracle qua ODP.Net. Tôi đã phát triển ứng dụng trên máy tính Windows XP (32-bit), nơi tôi đã cài đặt ODAC (32-bit). Ứng dụng chạy mà không có trục trặc trên PC phát triển của tôi nhưng ném một ngoại lệ trên máy chủ (Windows Server 2003 x64 gói dịch vụ 2).Lỗi System.Reflection.RuntimeModule.GetTypes() với ODP.Net và C#

Tôi đã cài đặt thời gian chạy cho .Net framework 4.0 (dotNetFx40_Full_x86_x64.exe) trên máy chủ, cũng như ODAC - lần đầu tiên tôi đã thử với Bản phát hành 4 (11.2.0.3.0) cho Windows x64 và sau đó với ODAC 11.2 Release 4 (11.2.0.3.0) với công cụ phát triển Oracle cho Visual Studio.

Không có tác phẩm nào được thực hiện. Phiên bản 32 bit có thêm một chút. Lần đầu tiên tôi gọi một câu lệnh LINQ trên cơ sở dữ liệu tôi nhận được thông báo sau.

at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) 
    at System.Reflection.RuntimeModule.GetTypes() 
    at System.Reflection.Assembly.GetTypes() 
    at System.Data.Metadata.Edm.ObjectItemAttributeAssemblyLoader.LoadTypesFromAssembly() 
    at System.Data.Metadata.Edm.ObjectItemAssemblyLoader.Load() 
    at System.Data.Metadata.Edm.ObjectItemAttributeAssemblyLoader.Load() 
    at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData) 
    at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage, Object& loaderCookie, Dictionary`2& typesInLoading, List`1& errors) 
    at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage) 
    at System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadAssemblyForType(Type type, EdmItemCollection edmItemCollection) 
    at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type type, Assembly callingAssembly) 
    at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) 
    at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName) 
    at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName) 
    at MyProgram.Data.DT.DTContext3.get_MYTABLE() 

Phiên bản 64 bit cho tôi biết tôi không có Oracle. Hỗ trợ quá nhiều, giống như thông báo lỗi ban đầu tôi nhận được khi lần đầu tiên tôi cố gắng chạy ứng dụng với ODAC trên máy chủ.

Bạn có thể giúp tôi điều đó không? Tôi đã nhìn thấy một số mục thảo luận về các vấn đề tương tự và câu trả lời thuyết phục duy nhất mà tôi thấy là xây dựng tệp thực thi với Sao chép cục bộ thành TRUE cho tất cả các tham chiếu và, nhưng thậm chí không thành công. Tôi vẫn nhận được thông báo lỗi tương tự.

Trả lời

2

Tôi vừa tự tìm thấy câu trả lời. Đoạn mã này, một bài viết của bgripka mà tôi tìm thấy trong một cuộc thảo luận về vấn đề này, đã cho tôi câu trả lời. Có một tham chiếu đến một thư viện còn thiếu (không cần thiết chút nào).

catch (ReflectionTypeLoadException ex) 
    { 
     StringBuilder sb = new StringBuilder(); 
     foreach (Exception exSub in ex.LoaderExceptions) 
     { 
      sb.AppendLine(exSub.Message); 
      if (exSub is FileNotFoundException) 
      { 
       FileNotFoundException exFileNotFound = exSub as FileNotFoundException; 
       if (!string.IsNullOrEmpty(exFileNotFound.FusionLog)) 
       { 
        sb.AppendLine("Fusion Log:"); 
        sb.AppendLine(exFileNotFound.FusionLog); 
       } 
      } 
      sb.AppendLine(); 
     } 
     string errorMessage = sb.ToString(); 
     log.Fatal(errorMessage); 
    }