Использование UserControl как ActiveX
От: x1 http://www.agpage.ru
Дата: 20.11.06 16:53
Оценка:
Надо получить доступ к UserControl как к компоненту ActiveX, всроив его в страницу html.

Создан Control со следующим кодом:

namespace KMC
{

[Guid("2840DD99-4747-404a-9929-37773840F080")]
public interface IKMControl
{

}

[Guid("3FC2FEE1-1153-4798-800E-288E64FA7B02"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface KMControlEvents
{

}

[Guid("402FCF87-8B9E-4389-BC48-08B4FCD85CB6"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(KMControlEvents))]
public partial class KMControl : UserControl, IKMControl
{
public KMControl()
{
InitializeComponent();
}

public void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello");
}
}
}

В свойствах проекта соит галочка Make Assembly COM Visible
Post-BuildeEvents:
$(TargetDir)gacutil.exe -i $(TargetPath) /silent
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm $(TargetPath) /regfile:$(TargetName).reg /silent
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm $(TargetPath) /codebase /tlb /silent

Пытаемся получить доступ через html:
<object id="Vasdfs" classid="KMControl.dll#KMC.KMControl" width="300" height="300" >
</object>
Пробовал так:
<object id="Vasdfs" classid="KMControl#KMC.KMControl" width="300" height="300" >
</object>
Не работает!!! Не могу понять, в чём дело. Сборка успешно регестрируется в GAC, генерится tlb, и в reg-файле есть строки:

[HKEY_CLASSES_ROOT\CLSID\{402FCF87-8B9E-4389-BC48-08B4FCD85CB6}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="KMC.KMControl"
"Assembly"="KMControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f92c5c71c3a08677"
"RuntimeVersion"="v2.0.50727"
Re: Использование UserControl как ActiveX
От: algol Россия about:blank
Дата: 20.11.06 21:46
Оценка:
Здравствуйте, x1, Вы писали:

x1>Надо получить доступ к UserControl как к компоненту ActiveX, всроив его в страницу html.

x1>Пытаемся получить доступ через html:
x1> <object id="Vasdfs" classid="KMControl.dll#KMC.KMControl" width="300" height="300" >
x1> </object>
x1>Пробовал так:
x1> <object id="Vasdfs" classid="KMControl#KMC.KMControl" width="300" height="300" >
x1> </object>
x1>Не работает!!! Не могу понять, в чём дело. Сборка успешно регестрируется в GAC, генерится tlb, и в reg-файле есть строки:

Вы здесь путаете два разных подхода. Вариант с classid="KMControl.dll#KMC.KMControl" — это использование .NET контрола на html странице. Он будет работать только при открытии страницы с web сервера (а не локально), и dll должна лежать в той же папке на сервере. При этом у вас скорее всего будут проблемы с безопасностью, нужно будет вручную ставить права для dll на клиенте.
Второй вариант — использование ActiveX контрола. В этом случае нужно писать:

    <object  id="Vasdfs" classid="CLSID:402FCF87-8B9E-4389-BC48-08B4FCD85CB6" codebase="KMControl.cab" width="300" height="300" > 
    </object>

В .cab положите сделанный для проекта инсталлятор .msi. Установка в GAC не обязательна, зато желательно реализовать интерфейс IObjectSafety, чтобы пометить контрол как безопасный.
Re[2]: Использование UserControl как ActiveX
От: x1 http://www.agpage.ru
Дата: 21.11.06 16:38
Оценка:
Здравствуйте, algol, Вы писали:

A>Вы здесь путаете два разных подхода. Вариант с classid="KMControl.dll#KMC.KMControl" — это использование .NET контрола на html странице. Он будет работать только при открытии страницы с web сервера (а не локально), и dll должна лежать в той же папке на сервере.

Почему будет работать только на сервере? Для работы необходим IIS?
A>Второй вариант — использование ActiveX контрола.
A>В .cab положите сделанный для проекта инсталлятор .msi.
Подскажите, пожалуйста, можно ли сделать .msi средствами Visual Studio 2005 или для этого нужны дополнительные программы.
A> Установка в GAC не обязательна.
Очень прошу пояснить, как можно использовать AciveX, не регестрируя сборку, его представляющую, в GAC.

C уважением и благодарностью, x1
Re[3]: Использование UserControl как ActiveX
От: algol Россия about:blank
Дата: 21.11.06 17:32
Оценка:
Здравствуйте, x1, Вы писали:

x1>Почему будет работать только на сервере? Для работы необходим IIS?


У меня эти сведения были отсюда:

Second, the page and the DLL must be hosted in a virtual directory in IIS, this will not work locally or in other web servers (at least it is not proven to do so). Also, the folder where the DLL containing the control is located must have Read permissions.


Но я думаю, что будет работать с любым сервером. Запуск контролов с локальной страницы запрещен по причинам безопасности:

All managed controls hosted by Internet Explorer use the latest version of the common language runtime installed on the computer. This means that in some instances the control may not run against the version it was built. This applies to any security zone, but does not apply to downloaded managed executables.

Note For security reasons, managed controls using the <object> tag and file access protocol in an HTML page are not supported. For example, the following <object> tag is not supported:
<OBJECT classid="file:///c:/control.dll#control&gt;


x1>Подскажите, пожалуйста, можно ли сделать .msi средствами Visual Studio 2005 или для этого нужны дополнительные программы.


Конечно можно средствами Visual Studio.

x1>Очень прошу пояснить, как можно использовать AciveX, не регестрируя сборку, его представляющую, в GAC.


Очень просто, в реестре в CodeBase прописывается путь к сборке.
Re[3]: Использование UserControl как ActiveX
От: algol Россия about:blank
Дата: 21.11.06 17:36
Оценка:
Здравствуйте, x1, Вы писали:

x1>Почему будет работать только на сервере? Для работы необходим IIS?


Еще забыл написать. В случае использования .NET контрола в эксплорере путь к нему в classid должен быть прописан в правильном регистре. Это баг в .NET 1.0/1.1 — URL case чувствителен. Возможно в 2.0 пофиксили.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.