[英]Why would some classes in an assembly be exposed to to COM but not others?
我正在努力制作供VBA使用的類庫。 我在項目中上了一堂課,但是第二堂課似乎沒有注冊。 如果我使用VBS進行測試,則CreateObject(“ Libname.Class2”)可以工作,但是CreateObject(“ Libname.Class1”)給出了“ ActiveX組件無法創建對象”錯誤。 RegAsm沒有提供任何有用的反饋-只是說某些類型已導出,但沒有告訴我為什么其他類型沒有。 我也只能在OleView中找到Class2。
與此類錯誤相關的問題的大多數答案都涉及使用了錯誤版本的RegAsm(x86 / x64)的情況,但是鑒於已經成功注冊了一個類,所以我無法想象是這種情況(無論如何,我都在同時注冊這兩個版本。 還有一些建議建議確保默認構造函數中包含某些內容,以便不會對其進行優化,但這似乎也無濟於事。
兩者具有完全相同的屬性(除了ProgId之外),並且具有相對相似的接口:
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface _Class1
{
_Class2 GetClass2();
string testertong { get; }
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class1")]
[ComVisible(true)]
class Class1 : _Class1
{
private ...;
public Class1 ()
{
/* Constructor stuff - commenting it out doesn't help */
}
public _Class2 GetClass2()
{
/* Generate and return an instance of Class2. Tried return null too */
}
public string testertong
{
get
{
return "I love yams";
}
}
}
和
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface _Class2
{
ArrayList GetLog(int entries);
string testytest { get; }
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class2")]
[ComVisible(true)]
public class Class2 : _Class2
{
internal IThing client;
public Class2()
{
/* Currently empty but works fine */
}
public ArrayList GetSubmissionLog(int entries)
{
return new ArrayList(client.GetSubmissionLog(entries));
}
public string testytest
{
get { return "wololo"; }
}
}
實際上,Class2是我創建和編譯的兩個中的第一個。 Class1實際上將成為執行一些WCF設置的Factory對象。 我不知道將類添加到先前注冊的程序集是否會引起問題(如果這樣,我將如何解決)?
以下VBS可以正常工作:
Set y = CreateObject("Libname.Class2")
Msgbox y.testytest
非常感謝任何幫助
由於未指定可見性級別,所以Class1
是隱式internal
。
更改為
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class1")]
[ComVisible(true)]
public class Class1 : _Class1
{
這記錄在ComVisibleAttribute下:
只有公共類型可以顯示。 該屬性不能用於使其他內部或受保護的類型對COM可見,或使不可見類型的成員可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.