2010-09-17 24 views
9

Tôi đã nâng cấp ứng dụng C# WinForms từ Visual C# 2008 (khung 3.5) sang 2010 (khung 4.0) và tôi gặp lỗi thời gian chạy.Tài nguyên hội họp FileNotFoundException trong dự án nâng cấp lên khung công tác VS 2010 4.0

Ứng dụng tải cụm động tại thời gian chạy bằng Assembly.Load (tên tệp). Nó được thiết kế theo cách này bởi vì phụ thuộc vào cấu hình người dùng nên tải các cài đặt khác nhau của assembly nằm trong các thư mục khác nhau.

Tất cả mọi thứ hoạt động tốt, ngoại trừ khi dll nạp đã có nguồn lực nhúng (bitmap hoặc XSD-bộ dữ liệu) sau đó tôi nhận được FileNotFoundException:

{ "Không thể tìm thấy tập tin 'FF.Fi_Stat.SKA.resources'." : null}

Việc lắp ráp được gọi là FF.Fi_Stat.SKA.dll. Tôi không hiểu thông báo này vì không có tài nguyên bên ngoài (chỉ những tài nguyên được nhúng) và không có tệp nào có tên được tạo bởi VS trong thư mục đầu ra. Bất kỳ ý tưởng?

-

Thông tin chi tiết:

Đây là cách tôi tải lắp ráp:

Assembly a = Assembly.LoadFile(assemblyFileName); 

Sự thật là việc lắp ráp các công trình, đó là khi tôi cố gắng tạo ra một thể hiện của một lớp bên trong hội đồng mà ngoại lệ xảy ra:

Type t = a.GetType("nameofclass"); 
Activator.CreateInstance(t); //fails here 

Đây là Stack Trace:

Exception has been thrown by the target of an invocation. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    ... 

Các nội ngoại lệ stack trace:

at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 
    at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) 
    at System.Resources.ResourceManager.GetString(String name) 
    at FF.Fi_Stat.SKA.RegForm.InitializeComponent() 
    at FF.Fi_Stat.SKA.RegForm..ctor() 

bây giờ tôi nhận ra rằng các dll mà không làm việc có dòng này trong InitializeComponent điểm chung:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegForm)); 

Tuy nhiên như tôi đã đề cập, điều này không có vấn đề gì với khung 3.5.

-

SOLUTION FOUND

tôi phát hiện ra rằng vấn đề có liên quan đến cách khuôn khổ dotnet cố gắng tìm nguồn tài nguyên cục bộ và sau khi tôi thêm dòng sau vào AssemblyInfo.cs trong hội đồng của tôi nó bắt đầu hoạt động trở lại.

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
+0

Cải thiện tài liệu của bạn về sự cố. Ít nhất một đoạn mã và theo dõi ngăn xếp của ngoại lệ. –

+0

Tôi đã thêm các chi tiết khác ngay bây giờ, vui lòng xem lại. Đã tìm thấy giải pháp –

+1

, đã thêm ghi chú ở trên. –

Trả lời

7

SOLUTION FOUND

tôi phát hiện ra rằng vấn đề có liên quan đến cách khuôn khổ dotnet cố gắng tìm nguồn tài nguyên cục bộ và sau khi tôi thêm dòng sau vào AssemblyInfo.cs trong hội đồng của tôi nó bắt đầu hoạt động trở lại.

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
1

Bạn có thể thử enabling logging in the the Fusion loader. Tôi đã có thành công lớn khi tạo ra giá trị DWORDEnableLog trong HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion đến 1. Sau đó, bạn sẽ nhận được thông báo lỗi tải chi tiết trong nhật ký sự kiện.

+0

Cảm ơn, tôi đã thử điều này nhưng tôi không chắc chắn cách sử dụng thông tin. Tôi có thể thấy nó cố tải tệp .resources của tệp dll được tải động của tôi và không tìm thấy nó nhưng nó không đưa ra bất kỳ gợi ý nào tại sao nó được coi là lỗi nghiêm trọng trong trường hợp này, bởi vì tôi cũng có thể thấy rằng nó cố tải -Các tệp .resources hiện có của các hội đồng được liên kết tĩnh của tôi mà không đưa ra một ngoại lệ về điều đó. –

+1

Công cụ Fuslogvw.exe là cái bẫy chuột tốt hơn ở đây, không cần phải hack registry. –

Các vấn đề liên quan