2008-09-29 22 views
11

Delphi (win32 yerel) uygulamasından COM üzerinden çağıran bir C# derim var.Regasm.exe neden benim C# derlememi yanlış GUID ile kaydettiriyor?

Bu, üzerinde çalıştığım tüm makineler üzerinde çalışıyor, bunlardan biri hariç.

Sorun, COM nesnesini oluşturmaya çalışırken Delphi uygulamasının "Sınıf kayıtlı değil" olması.

Şimdi, HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID altında kayıt defterine baktığımda, orada listelenen GUID AssemblyInfo.cs derleme kılavuz ile aynı değildir. Aynı olmalı - kurulu olduğu tüm diğer bilgisayarlarda da aynı.

Ben regasm /unregister delphitocsharp.dll denemiş ve bu kayıt defteri anahtarını kaldırır. Sonra regasm delphitocsharp.dll yaparsanız, kayıt defteri anahtarını döndürür, ancak GUID öncekiyle aynıdır (yani yanlış) ve Delphi hala "Sınıf kayıtlı değil" alır. çalışma makinede

DelphiToCSharp.dll olmayan çalışma makinesi üzerinde sürüme (MD5 ile doğrulanmıştır) aynıdır.

Aklıma gelen tüm

dll eski bir sürümünü daha önce tescil edilmiş olması ve yine regasm karıştı yapıyor bu dosyanın bazı kalıntısını vardır.

Bu sorunu nasıl giderebilirim veya en azından daha fazla teşhis edebilirim?

cevap

12

AssemblyInfo'daki GUID, "Tür Kitaplığı" GUID'si olur ve genellikle aradığınız şey değildir. Bir sınıfa erişmeye çalıştığınızı ve sınıf için bir Guid niteliği ve ComVisible tanımlamanız gerektiğini varsayacağım. Örneğin:

, sonra sınıf ya a) kayıtlı edilmeyecektir yoksa
[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]  
public class MyCOMRegisteredClass 

veya montaj düzeyinde) ComVisible (true tanımladıysanız b) Bir guıd atanacak Bu .NET sizin için pişiriyor.

1

Belki de derlemenin eski bir sürümü var mı? Belki GAC'de? Regasm muhtemelen onu toplayıp kullanıyor.

+0

GAC'de olamaz, çünkü derlemem imzalı değil. İyi bir nokta olsa da, dosyanın diğer kopyalarını arayacağım. – Blorgbeard

+0

.Net'in derleme yüklemesi, dll'yi win32'nin yaptığı gibi pek çok dizinde bulamaz, dolayısıyla bu durum pek de zor olamaz. –

1

Büyük olasılıkla Bir yere sisteminizde aynı dosyanın kopyaları için arama diski aynı (eski sürüm) dll bir kopyasını ve yeni bir kopyasını kayıt olmadan önce manuel olarak (yedek) bunları kaldırın.

İlgili konular