2009-10-30 2 views
1

Я пытаюсь разоблачить нашу библиотеку через COM, но, похоже, сражаюсь с инструментами больше, чем с реальной проблемой. Независимо от того, как я пишу свой открытый класс COM, я получаю предупреждение: «XXX.dll не содержит типов, которые могут быть зарегистрированы для COM-взаимодействия» (отмеченный проект как «Регистрация для COM-взаимодействия в свойствах проекта»). Даже простой класс ниже (в качестве единственного класса в сборке, который подписывается и помеченной ComVisible (ложной)) по-прежнему сохраняется предупреждение:Regasm и Com Interop false negatives

[Guid("77699130-7D58-4d29-BE18-385871B000D1")] 
    [ComVisible(true)] 
    public interface IExample 
    { 
    string GetText(); 
    void SetText(string text); 
    } 

    [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")] 
    [ComVisible(true)] 
    public class Example : IExample 
    { 
    private string m_text = "default text"; 

    public string GetText() 
    { 
     return m_text; 
    } 

    public void SetText(string text) 
    { 
     m_text = text; 
    } 
    } 

Я попытался запустить Regasm из командной строки на выходе которой с радостью заявляет «Зарегистрированные типы». Однако, работая с/verbose switch, дополнительная информация не отображается (я, кажется, помню, что она содержит имя или, возможно, только количество зарегистрированных типов). Также попытался запустить Regasm с переключателем/RegFile для создания RegFile, который генерирует это:

[HKEY_CLASSES_ROOT\ComExample.Example] 
@="ComExample.Example" 

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID] 
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}" 

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}] 
@="ComExample.Example" 

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="ComExample.Example" 
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0] 
"Class"="ComExample.Example" 
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c" 
"RuntimeVersion"="v2.0.50727" 

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId] 
@="ComExample.Example" 

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}] 

Я не COM колдун какой-то мере, но регистрация выглядит действительным для меня. Тем не менее, ничего не появляется в реестре при запуске regasm на сборке.

Так что мой вопрос правильно ли я что-то в моем простом примере не хватает, чтобы иметь регистрационную работу, я вижу ложные показания и регистрации на самом деле правильно, и как я могу лучше определить, является ли COM регистрации на самом деле работает

EDIT: Используя изменения, предложенные Kev, я не мог избежать предупреждений из VS2008, но я мог фактически получить что-то зарегистрированное в реестре, используя regasm напрямую (ничего в реестре только из интеграции VS2008).

Затем я попытался удалить простой класс, чтобы у меня была пустая сборка. Запуск regasm на этом не сообщал о каких-либо предупреждениях, только «Типы успешно зарегистрированы». Я вижу предупреждения типа «RegAsm: warning RA0000: никаких типов не было зарегистрировано» при запуске RegAsm на некоторых из моих других сборок, которые могут быть неправильно обнаружены COM. Что здесь происходит, могу ли я доверять чему-либо, кроме реестра, а также о предупреждениях включения/выключения из regasm?

+0

В какой версии Windows вы строите? XP, Vista, Win7? 32bit/64bit? – Kev

+0

Я нахожусь на XP (32 бит) –

+0

К сожалению, у меня нет копии XP, чтобы попробовать это :(. Я просто не могу воспроизвести проблему, с которой вы столкнулись. – Kev

ответ

2

Я создал проект библиотеки классов, основанный на коде следующим образом:

На странице свойств проекта, выберите вкладку подписи. Установите флажок «Подписать сборку» и выберите <New...> в раскрывающемся списке «Выбрать сильный ключевой файл:».

Затем я добавил следующий класс (Example.cs):

[Guid("77699130-7D58-4d29-BE18-385871B000D1")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface IExample 
{ 
    [DispId(1)] 
    string GetText(); 

    [DispId(2)] 
    void SetText(string text); 
} 

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
public class Example : IExample 
{ 
    private string m_text = "default text"; 

    [ComVisible(true)] 
    public string GetText() 
    { 
     return m_text; 
    } 

    [ComVisible(true)] 
    public void SetText(string text) 
    { 
     m_text = text; 
    } 
} 

Затем я построил проект затем упал в командной строке, где DLL был выход из сборки.

Для регистрации:

regasm.exe COMInteropTesting.dll /register /codebase /tlb

Если компонент должен быть доступен для нескольких приложений:

gacutil.exe -i COMInteropTesting.dll

Это все работало плавник e на Windows 2003 32bit, Windows 2008 32bit и Windows 7 64 бит.

Один из них, однако, заключается в том, что если вы тестируете компонент с помощью CScript в 64-битной системе, вам нужно запустить правильный интерпретатор CScript. Если вы зарегистрировали сборку с использованием 32-битного RegAsm.exe (по адресу C:\Windows\Microsoft.NET\Framework\v2.0.50727), вам необходимо запустить 32-битный интерпретатор CScript на c:\Windows\SysWOW64.

+0

Еще одно предупреждение от VS2008 ... вздох .... Однако похоже, что он действительно появляется в реестре Надеюсь на более четкое указание на успех. (Вопрос: мне действительно нужно добавить его в gac, если я зарегистрируюсь в/codebase) –

+0

А ... У меня есть компонент COM, который мы регистрируем в GAC. сказал, что я нахожу ваше затруднительное положение очень странным. – Kev

+0

Отмечая это как ответ, так как это создаст рабочий образец –

 Смежные вопросы

  • Нет связанных вопросов^_^