Здравствуйте!
Ситуация такая: я создаю сервер на С# с простым классом и интерфейсом к нему (как описано в MSDN — Interop tutorial). Затем я регистрирую его при помощи
regasm somepath\....\CSharpServer.dll /tlb: somepath\.....\CSharpServer.tlb
Все регистрируется успешно.
Затем в С++ я импортирую библиотеку типов при помощи #import из того места, где она образовалась, т.е. из \CSharpServer\bin\debug. Она импортируется (проект компилируется), но во время выполнения при вызове CoCreateInstance происходит ошибка: не найден файл. После "побайтного" сравнения с примером из MSDN нашел фишку — они копируют dll в директорию клиента. Может, я чего-то не понимаю, тогда объясните — какой же это COM? Разве COM не должен сам уметь определить, где лежит зарегистрированная dll??
Здравствуйте, dmitry_npi, Вы писали:
_>Здравствуйте!
_>Ситуация такая: я создаю сервер на С# с простым классом и интерфейсом к нему (как описано в MSDN — Interop tutorial). Затем я регистрирую его при помощи
_>_>regasm somepath\....\CSharpServer.dll /tlb: somepath\.....\CSharpServer.tlb
_>
_>Все регистрируется успешно.
_>Затем в С++ я импортирую библиотеку типов при помощи #import из того места, где она образовалась, т.е. из \CSharpServer\bin\debug. Она импортируется (проект компилируется), но во время выполнения при вызове CoCreateInstance происходит ошибка: не найден файл. После "побайтного" сравнения с примером из MSDN нашел фишку — они копируют dll в директорию клиента. Может, я чего-то не понимаю, тогда объясните — какой же это COM? Разве COM не должен сам уметь определить, где лежит зарегистрированная dll??
если внимательно посмотреть в реестре, то видно в отличие от обчного com в inprocServer32 прописывается не путь до com-сервера, а mscoree.dll и указано имя сборки для загрузки. так вот эта сборка либо располагается в GAC либо лежит в доступном для клиента месте (в вашем случае в его директории)
Здравствуйте, dmitry_npi, Вы писали:
_>во время выполнения при вызове CoCreateInstance происходит ошибка: не найден файл. После "побайтного" сравнения с примером из MSDN нашел фишку — они копируют dll в директорию клиента. Может, я чего-то не понимаю, тогда объясните — какой же это COM? Разве COM не должен сам уметь определить, где лежит зарегистрированная dll??
может это потому что:
...
Таким образом, мы видим, что CoCreateInstance создает в памяти не сам компонент, а библиотеку mscoree.dll, которая является средой исполнения .NET.
...
http://rsdn.ru/?article/dotnet/net2com.xmlАвтор(ы): Алексей Дубовцев
Дата: 19.11.2001
... << RSDN@Home 1.2.0 alpha rev. 655>>