2008-09-29 20 views
11

Tôi đã có một hội đồng C# mà tôi gọi qua COM từ một ứng dụng Delphi (win32 bản địa).Tại sao regasm.exe đăng ký tổ hợp C# của tôi với GUID sai?

Tính năng này hoạt động trên tất cả các máy tôi đã thử nghiệm, ngoại trừ một máy.

Vấn đề là ứng dụng Delphi nhận được "Lớp không được đăng ký" khi cố gắng tạo đối tượng COM.

Bây giờ, khi tôi tìm trong sổ đăng ký theo HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID, GUID được liệt kê không giống với hướng dẫn lắp ráp trong AssemblyInfo.cs. Nó sẽ giống nhau - nó giống nhau trên tất cả các máy tính khác mà nó được cài đặt.

Tôi đã thử regasm /unregister delphitocsharp.dll và điều đó sẽ xóa khóa đăng ký. Sau đó, nếu tôi làm regasm delphitocsharp.dll, khóa đăng ký trả về, nhưng GUID giống như trước (ví dụ: sai) và Delphi vẫn nhận được "Lớp không được đăng ký".

DelphiToCSharp.dll trên máy đang hoạt động giống hệt nhau (được xác minh bằng md5) với phiên bản trên máy không hoạt động.

Tất cả những gì tôi có thể nghĩ là một phiên bản cũ của dll đã được đăng ký trước đó và vẫn tồn tại một số phần còn lại của tệp đó đang làm cho sự bối rối bối rối.

Làm cách nào để khắc phục hoặc ít nhất chẩn đoán thêm vấn đề này?

Trả lời

12

GUID trong AssemblyInfo trở thành GUID "Loại thư viện" và thường không phải là những gì bạn đang tìm kiếm. Tôi sẽ giả sử bạn đang cố gắng truy cập một lớp, và bạn cần phải định nghĩa một thuộc tính Guid và ComVisible cho lớp đó. Ví dụ:

[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]  
public class MyCOMRegisteredClass 

Nếu bạn không, thì lớp học này sẽ không được đăng ký hoặc b) nếu bạn đã xác định COMVisible (true) ở cấp hội đồng, sẽ được chỉ định một guid .NET thu lại cho bạn.

1

Có thể bạn có phiên bản cũ của hội đồng ở đâu đó? Có lẽ trong GAC? Regasm có lẽ đang nhặt nó lên và sử dụng nó.

+0

Không thể ở trong GAC, vì hội đồng của tôi chưa được ký. Mặc dù vậy, tôi sẽ tìm kiếm các bản sao khác của tệp. – Blorgbeard

+0

Tải lắp ráp của .Net không tìm thấy dll trong nhiều thư mục như win32, do đó khó có thể xảy ra. –

1

Có lẽ bạn có một bản sao của cùng một phiên bản cũ (cũ) trên hệ thống của bạn, tìm kiếm các bản sao của cùng một tệp và xóa (sao lưu) chúng theo cách thủ công trước khi đăng ký bản sao mới.

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