2012-05-11 1 views
0

У меня есть .Net COM-сервер, у которого есть метод, который принимает сообщение и задержку как параметры. После задержки он вызывает событие, отправляющее сообщение клиенту.Почему я не получаю библиотеку типов при поиске .Net COM-сервера от клиента FoxPro

Он работает с клиентами .Net и VB6.

Для того, чтобы получить COM событие, чтобы связать в FoxPro, вы должны создать класс, который реализует интерфейс событий в FoxPro и провод его, как описано здесь: http://www.west-wind.com/presentations/dotnetfromVfp/DotNetFromVfp_EventHandling.asp

У меня есть такой класс:

DEFINE CLASS ComEventHandler AS session OLEPUBLIC 
    IMPLEMENTS IComServerEvents IN "PcaTest.ComServer" 
    * "C:\ComTest\PCATest.tlb" 

    PROCEDURE IComServerEvents_TimerExpired(message AS STRING) AS VOID 
    * add user code here 
    ?message 
    ENDPROC 
ENDDEFINE 

И код телеграфировать это вверх:

loMM = CREATEOBJECT("PcaTest.ComServer") 
loEvents = CREATEOBJECT("ComEventHandler") 

EventHandler(lomm, loevents) 

Когда я запускаю этот код, я получаю Тип библиотеки PcaTest.ComServer не найдено. Тем не менее, он работает, как ожидалось, если я изменить линию орудия для:

IMPLEMENTS IComServerEvents IN "C:\ComTest\PCATest.tlb" 

Я не могу жестко закодировать расположение TLB.

Строка «CREATEOBJECT (« PcaTest.ComServer »)» работает отлично, и если я не пытаюсь создать экземпляр объекта ComEventHandler, этот COM-объект будет создан, и я могу вызвать его методы и получить доступ к его свойствам. Класс обработчика событий (в основном) работает только тогда, когда я кормлю его .tlb, а не progId.

. COM-сервер COM зарегистрирован в GAC. Я пробовал regasm с и без/codebase и с и без/tlb или /tlb:filename.tlb

У меня было это, работая в тестировании в какой-то момент, или так казалось. Я не могу повторить эти результаты сейчас, но когда я работал, я использовал/codebase и /tlb:filename.tlb.

ответ

0

Я ненавижу, чтобы ответить на мой собственный вопрос. Еще раз. Но я понял.

Ответ: использование regasm/codebase, когда сборка зарегистрирована в GAC, делает ее неработоспособной. Моя проблема заключалась в том, что если бы я сделал regasm, прежде чем устанавливать сборку в GAC, это сработает, но если сборка была зарегистрирована в GAC сначала или если она была зарегистрирована в GAC, а regasm вызывается позднее, FoxPro получает смущенный.

Потребление.события Net COM сервера в FoxPro абсолютно необходимы:

  • сборку зарегистрированных для COM (Progid и CLSID), вероятно, Regasm
  • /кодовой флаг на Regasm, который добавляет что-то вроде этого в реестр:

    [HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32] 
    @="mscoree.dll" 
    "CodeBase"="file:///C:/MACsWave/PCATest/pcatest.dll" 
    

    Codebase требуется, хотя сборка должна быть доступна из GAC./codebase не требуется для клиентов VB6, например

  • /tlb flag для регистрации typelib./tlb: "filename" не требуется.

Поскольку используется флаг/codebase, регистрация сборки в GAC не требуется.

Если вы добавить сборку в GAC, а затем позвонить Regasm/кодовую, вы получите это в реестре:

[HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32] 
@="mscoree.dll" 
"CodeBase"="file:///C:/WINDOWS/assembly/GAC_32/PCATest/1.1.0.0__325ac2fec08eafa8/PCATest.dll" 

Интересно, будет ли возможно, FoxPro ищет файл TLB в том же каталоге, dll, но находит, что в GAC нет .tlb. Или что-то ...

В любом случае проблема решена.

0

Вы сказали, что вы не можете жестко закодировать место, мне было интересно, если вы могли бы поставить его в таблицу, выберите его из таблицы, а затем использовать что-то вроде этого

tlbLocation (поле, содержащее путь)

ИНВЕНТАРЬ IComServerEvents IN (tlbLocation)

я подобные спецификации пути с некоторыми из моих приложений

+0

Я - FoxPro n00b. Я предположил, что строка «Реализаторы» была скомпилирована в fxp и не интерпретирована во время выполнения. Если бы мне пришлось искать путь, я бы проверял реестр, чтобы он мог меняться в зависимости от машины. (файлы программ и программных файлов (x86)) Но я знал, что не хочу этого делать, потому что у меня было это нормально, по крайней мере, дважды, и я подумал, что мне просто нужно выяснить, как это сделать. –

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

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