2010-09-13 42 views
60

Bu iki seçenek arasındaki gerçek fark nedir? Bildiğim geçerli: COM birlikte
Bu seçenekler için"COM Interop'a kaydolun" vs "Montaj COM görünür"

Kayıt aksamındaki regasm yürütür ve kayıt defteri girdileri gibi tüm COM kayıt defterindeki bir COM bileşeni (ya da belki değil) olarak montaj kaydeder. Bu adım bir TLB dosyası oluşturur mu? Başka ne yapılır?

Bazen projeyi derlediğimde bir tlb oluşturduğumu görüyorum, ancak bazen değil, neden bu? Görünür

Yap montaj COM bir montaj üzerinde bu birine sahiptir neyi etkisi
? Bu derlemenin içinde aşağıdaki türde bir tür varsa, türümün ComVisible olarak işaretlenmiş olmasına rağmen, "COM'unu görünür yap" seçeneğini belirtmem gerekir mi?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)] 
public interface IMyInterface 
{ 
} 

cevap

90

"montaj COM görünür yap" montaj [ComVisible] içinde tüm kamu türlerini yapmak için büyük bir çekiç. Nadiren istenirse, snippet'inizde yaptığınız gibi görünür olmak istediğiniz belirli türleri seçmek isteyeceksiniz.

Montaj tamamlandıktan sonra, bir COM istemcisinin geri bulabilmesi için kaydedilmesi gerekir. Sadece oluşturmak istediği nesneyi tanımlamak için bir sayı kullanan GUID, hangi DLL'in onu uygulayacağını bulmak için ekstra bir aramaya ihtiyaç duyar. Kayıt olmak, kayıt defterinin HKLM\Software\Classes\CLSID\{guid} bölümüne yazma anahtarlarını içerir. Regasm.exe /codebase /tlb'u çalıştırarak kendiniz yapabilirsiniz ya da montajı yaptıktan sonra otomatik olarak yapmak için yapı sistemine bırakabilirsiniz.

Hangi "COM birlikte çalışabilirim" yazıyor. Üzerine yazılmadan önce DLL dosyasının eski kopyasının otomatik olarak kayıtsız kalmasını sağlar, bu da kayıt defteri kirliliğini önler. VS, bu kayıt defteri anahtarlarına yazma erişimi için yükseltilmiş şekilde çalıştırılmalı ve isteğe bağlı olarak yapılmalıdır. Ya da sadece sunucuya ortak olmak istemezsiniz. Neden daha fazla tanılama olmadan bazen .tlb'yi alamadığınızı anlatamam.

+1

+1. İsteğe bağlı neden bir neden daha olduğunu sanıyorum, her zaman derlemeyi günlük yapı sunucunuza kaydettirmeniz gerekmez. Örneğin, bir C# derlemesini COM'a maruz bırakır ve C++ 'dan .tlb dosyasını kullanmaktan mutlu olan '# import' yönergesiyle kullanırsınız. – sharptooth

+0

+1: "Montajda tüm türler [ComVisible]" derken, tüm kamu türleri * demek istiyorsunuz, çünkü kamu türleri ihraç edilen TLB'de gördüğüm şeydir. – A9S6

+0

Teşekkürler, yorumlar cevapta birleştirildi. –