Статья оказалась очень полезной, спасибо.
Вот только интересно, почему автор не говорит о возможностях
Visual Studio по этой теме.
Вполне замечательно срабатывает такой вариант.
Создать проект Class Library.
В свойствах проекта выставить :
[Make Assembly COM — Visible];
(при желании) [Register for COM interop];
(и, если необходим ключ) [Sign The Assembly]
В принципе, это избавляет от необходимости описания
интерфейса в начале и т.д.
Просто пишется "обычная dll", с любым (относительно) кодом.
А при компиляции VS делает все сам.
В качестве пожелания, дополнить статью этим методом.
Думаю, для многих такой вариант окажется "проще".
Здравствуйте, Алексей Дубовцев, Вы писали: АД> ...вы сможете с легкостью использовать компоненты .NET в ваших приложениях при помощи COM.
Пробую dhtml пример, отваливается на Orbit = new ActiveXObject("TestComponentLib.TestComponent");
Тупо свалил в одну директорию .dll+.htm, чего не хватает? В реестре вижу Class как в статье, .еxe пример работает нормально.
IE 7.0, MS FW 2.0
Здравствуйте, gok, Вы писали:
gok>Здравствуйте, recLusa, Вы писали: L>>Создать проект Class Library. L>>В свойствах проекта выставить :
gok>пытаюсь повторить, не найду где в vc2005 ставятся флажки для сборки?
gok>Проект Class Lib, в assemblyInfo.cpp вижу/меняю [assembly:ComVisible(true)]; gok>Какие команды пользовать для остальных ключей? (Register, Sign, ...) gok>gok
День добрый.
Вот. Если еще не нашел:
Заходишь Меню Project -> MyClassLibrary Properties.
Далее вкладка Application. Кнопка Assembly Information.
Там внизу есть флажок Make Com Visible.
На вкладке Build тоже внизу галочка register for com interop.
На вкладке Signing галочка Sign thr assembly.
И далее дает возможность сделать новый key или выбрать имеемый.
Правда, обычно ключиком не подписываю (вообще обхожусь без этого).
И регистрирую regasm -ом, так как тестировать COM имеет смысл наверное
в контексте того Win32 Apz, для кот. он пишется.
Поэтому подкидываю готовую dll-ку туда, куда надо и регистрирую:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe MyClassLibrary.dll /codebase /tlb MyClassLibrary.tlb
Прекрасно работает и на Develop машине и у заказчиков.
Удачи!
Здравствуйте, recLusa, Вы писали:
L>[Использование .NET компонентов при помощи COM]
L>Статья оказалась очень полезной, спасибо. L>Вот только интересно, почему автор не говорит о возможностях L>Visual Studio по этой теме.
L>Вполне замечательно срабатывает такой вариант.
L>Создать проект Class Library. L>В свойствах проекта выставить :
Можно еще проще, при создании библиотеки класса указать что это библиотека типа COM class и VS сама сгенерит шаблон необходимый для создания com-библиотечки.
мне понадобилось переделать тип сборки с DLL на EXE, так как получил конфликт различных сторонних DLL (не комовских).
то есть мне нужен outproc server, чтобы весь .NET работал в отдельном процессе.
сразу всё резко перестало работать. получил сообщение что CLSCTX некорректен.
возможно ли создать на дот нете COM outproc server ?
если да, то как?
я просто поменял тип проекта "Class library" на "Windows Application" и прикрутил форму.
точно также запускаю
regasm my.exe /tlb
получаю нормальную tlb
но EXE не пашет
а DLL пашет как часы.
Что забыл?
from __python__ import paradigma
from __future__ import generators
from __waterfall__ import power
Re[2]: Использование .NET компонентов при помощи COM
неужели никто никогда не делал EXE outproc сервера на дот нете?
ну ведь надо же что-то прикрутить и всё заработать должно.
в инете полно примеров, как делать DLL — class library, но ничего нет про EXE.
у Троельсена в теме "Обращение клиента СОМ к сборке .NET" рассматривается тоже DLL
есть правда тема "Взаимодействие со службами СОМ+"
где говориться буквально следующее
ApplicationActivationAttribute Определяет, будет ли компонент, определенный в сборке,
запускаться в процессе создателя (библиотечное приложение)
или в системном процессе (серверное приложение)
и следующее
в среде выполнения .NET могут работать только модули DLL
и следующее
Как уже говорилось, приложения MTS и СОМ+ бывают двух
разновидностей: библиотечные (активируемые в процессе вызывающего клиента)
и серверные (для них создается новый объект dllhost.exe). По умолчанию создается
библиотечное приложение.
вот мне и нужен отдельный серверный тип, но мне не нужен COM+
как просто и сердито сконвертировать работающее приложение DLL написанное на шарпе,
которое выставляет один интерфейс с одной функцией через CCW,
чтобы стать EXE out-proc сервером, что надо прикрутить?
надо же как-то организовать цикл месаг, кто делал?
не надо никаких мультипоточностей, обычное STA приложение,
точнее COM out of process server, написанное на шарпе.
переделать на out-proc понадобилось, потому как есть конфликтующие DLL разных версий, которые нельзя выкосить.
from __python__ import paradigma
from __future__ import generators
from __waterfall__ import power
Re[3]: Использование .NET компонентов при помощи COM
Здравствуйте, recLusa, Вы писали:
L>Создать проект Class Library. L>В свойствах проекта выставить : L>[Make Assembly COM — Visible]; L>(при желании) [Register for COM interop]; L>(и, если необходим ключ) [Sign The Assembly]
L>В принципе, это избавляет от необходимости описания L>интерфейса в начале и т.д.
Плохая идея:
1. При каждой компиляции все GUIDы будут перегенерированы и на совместимости со старыми версиями можно ставить крест. Поэтому надо описывать интерфейс и прописывать ему атрибут Guid, и указывать Guid для классов.
2. Указание ComVisible в свойствах проекта сделает видимыми все public классы, а не только те которые нужно. Я видел такой индусский плагин, который загадил весь реестр полсотней ненужных классов, форм и интерфейсов вместо регистрации одного-единственного класса. Поэтому атрибут ComVisible лучше ставить только для тех классов, которые собираетесь показывать для COM interop.
Re[7]: Использование .NET компонентов при помощи COM
От:
Аноним
Дата:
18.08.08 04:05
Оценка:
Аналогичная проблема не могу работать со строковыми переменныыми.
вот код библиотеки на C#
public interface IMifareLibrary
{
String G_Name { get; set;}
}
public class MifareLibrary : IMifareLibrary
{
private String PG_Name;
//конструктор класса
public MifareLibrary()
{
PG_Name = "";
PG_Passwd = "";
}
public String G_Name
{
get
{
return PG_Name;
}
set
{
PG_Name = value;
}
}
}
Код в клиенте
#include <windows.h>
#include <stdio.h>
#include <comdef.h>
#import"mifarelibrary.tlb" raw_interfaces_only
using namespace MifareLibrary;
void main()
{
if (FAILED(CoInitialize(NULL)))
return;
_bstr_t bstrCLSID;
CLSID clsidOrbit;
IMifareLibrary* pIOrbit;
HRESULT hr;
bstrCLSID = "MifareLibrary.MifareLibrary";
if (FAILED(CLSIDFromProgID (bstrCLSID,&clsidOrbit)))
return;
if (FAILED(CoCreateInstance(clsidOrbit,0,CLSCTX_ALL,__uuidof(IMifareLibrary),(void**)&pIOrbit)))
return;
BSTR strAbout;
pIOrbit->get_G_Name((unsigned short **)"Volkov");
pIOrbit->put_G_Name(strAbout);
printf("Printf Connect To Gate = %d\n",t);
pIOrbit->Release();
CoUninitialize();
}
Не понимаю почему она просит преобразование в (unsigned short **). Смотел по примерам никто с такой проблемой не сталкивался.
Собственно на функции присваивания программа и отваливается ( Уже голова кипит не понимаю в чем проблема.