IExtantion

0 голосов
спросил 19 Ноя, 10 от Commrad1 (3,660 баллов) в категории Программные продукты Esri
Добрый день! Может кто поможет? Не получается создать приложение для ArcMap на VB.NET. Класс созданный по умолчанию IExtention не регистрируется в Desktop.
Заранее благодарен!

8 Ответы

0 голосов
ответил 19 Ноя, 10 от -3A- (5,220 баллов)
а где код?
телепатов здесь вряд ли найдешь image
0 голосов
ответил 19 Ноя, 10 от Commrad1 (3,660 баллов)
Код простой. Сгененрирован самим VB.NET.
На VB6.0 подобное приложение работает замечательно, да и примеров и литературы много для него, просто хотелось перейти NET, но что-то в Help только код VB6.0.


Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.esriSystem

<ComClass(ArcGISClass1.ClassId, ArcGISClass1.InterfaceId, ArcGISClass1.EventsId), _
 ProgId("EngineClassLibrary1.ArcGISClass1")> _
Public Class ArcGISClass1
    Implements ESRI.ArcGIS.esriSystem.IExtension
    Implements ESRI.ArcGIS.esriSystem.IAutoExtension
    Implements ESRI.ArcGIS.esriSystem.IExtensionAccelerators
    Implements ESRI.ArcGIS.esriSystem.IExtensionConfig
    Private m_extState As esriExtensionState

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class
    ' and its COM interfaces. If you change them, existing
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "6c735ef0-b2de-4456-82c0-fd5b1a2cfed8"
    Public Const InterfaceId As String = "41188ba2-fc08-4de1-949e-780fb614ebfe"
    Public Const EventsId As String = "c3d91d41-794a-442a-9e33-56831d8d5b29"
#End Region

    ' A creatable COM class must have a Public Sub New()
    ' with no parameters, otherwise, the class will not be
    ' registered in the COM registry and cannot be created
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

    Public ReadOnly Property Name() As String Implements ESRI.ArcGIS.esriSystem.IExtension.Name
        Get
            Name = "NewExt"
        End Get
    End Property

    Public Sub Shutdown() Implements ESRI.ArcGIS.esriSystem.IExtension.Shutdown

    End Sub

    Public Sub Startup(ByRef initializationData As Object) Implements ESRI.ArcGIS.esriSystem.IExtension.Startup

    End Sub


    Public Sub CreateAccelerators() Implements ESRI.ArcGIS.esriSystem.IExtensionAccelerators.CreateAccelerators

    End Sub

    Public ReadOnly Property Description() As String Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.Description
        Get
            Description = ""
        End Get
    End Property

    Public ReadOnly Property ProductName() As String Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.ProductName
        Get
            ProductName = "New Extention"
        End Get
    End Property

    Public Property State() As ESRI.ArcGIS.esriSystem.esriExtensionState Implements ESRI.ArcGIS.esriSystem.IExtensionConfig.State
        Get
            State = esriExtensionState.esriESEnabled
        End Get
        Set(ByVal value As ESRI.ArcGIS.esriSystem.esriExtensionState)
            m_extState = value
        End Set
    End Property



End Class
0 голосов
ответил 19 Ноя, 10 от -3A- (5,220 баллов)
так что-то кода регистрации я здесь не вижу
в VB.NET не силен, но в C# должны быть примерно такие строчки:


[ComRegisterFunction,
ComVisible(false)]
private static void RegisterFunction(System.Type registerType)
{
string key = string.Format(@"HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
MxExtension.Register(key);
}

[ComUnregisterFunction,
ComVisible(false)]
private static void UnregisterFunction(System.Type registerType)
{
string key = string.Format(@"HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
MxExtension.Unregister(key);
}


если в настройках проекта включена галка "Register for COM-interop", этот код вызовется и зарегистрирует в реестре нужную для Desktop инфу (или при вызове regasm с соответствующими ключами)

так что нужно курить в сторону атрибутов ComRegisterFunctionAttribute и ComUnregisterFunctionAttribute image
0 голосов
ответил 19 Ноя, 10 от -3A- (5,220 баллов)
ну, вот это оно и есть
а в свойствах проекта галка "Register for COM interop" выставлена?

Дело в том, что VB6 - это чистый COM
а VB.NET - это ни разу не COM, и чтобы зарегистрировать свое приложение как COM-сервер, нужны дополнительные телодвижения

в общем, рекомендую почитать статьи типа "Взаимодействие .NET и COM" (на rsdn.ru, например)

хм, пока сообщение писал, ты зачем-то свое потер image
0 голосов
ответил 19 Ноя, 10 от Commrad1 (3,660 баллов)
Да, туплю не по детски. Не мой сегодня день. Это не из того класса код. В классе Extention нет таких строчек.
0 голосов
ответил 19 Ноя, 10 от -3A- (5,220 баллов)
бывает
надеюсь, что помог image
0 голосов
ответил 19 Ноя, 10 от Commrad1 (3,660 баллов)
Да, спасибо. Разобрался. Только получается что он регистрирует при компиляции, а как на других машинах регистрировать? Через RegCat не хочет.
0 голосов
ответил 19 Ноя, 10 от -3A- (5,220 баллов)
если вручную, то через RegAsm
если через инсталлятор - то это уже от него зависит
в InstallShield, к примеру, включается галка типа "Register for COM interop"

кстати, в хэлпе это все подробно расписано (и для C# и для VB.NET)
по крайней мере, в моем (ArcGIS 9.3.1 - раздел "Programming with .NET")
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...