Samstag, 28. Juli 2007

My Extensions in VS2008

Nach einem Tag downloaden und Installation, habe ich nun endlich die Beta2 von Visual Studio 2008 "Orcas" auf meinem Rechner.





Aufgefallen ist mir der neue Projekttab "My Extensions"




Sollte es damit einfacher möglich sein neue Erweiterungen für den My Namespace zu erstellen?

Der Link "Learn more about customizung the My Namespace" war leider tot. Auch nachdem ich die 2Gig große VS2008MSDN runtergeladen und installiert hatte.

Gefunden habe ich dann doch noch, wonach ich gesucht hatte. Und zwar die Quelldatei für die WPF My Extensions, die bereits in Orcas auszuwählen sind. Diese befindet sich unter dem Ordner "My Project" in dem Ordner "MyExtensions". Dort wird man dann auch in Zukunft eigene Extensions für den My Namespace ablegen können.

Bleibt nach wie vor die Frage: Woher weiß VisualStudio, dass eine "My Extension" vorhanden ist? Ich habe weder eine Assembly noch ein Item-Template gefunden, dass die Vorlage für die "WPF My Extension" liefert. (Eine entsprechende Frage wie man denn diese My Extensions verwendet habe ich gleich nach der Entdeckung in das MSDN Forum gestellt. Mal gucken ob in nächster Zeit eine Anwort darauf zu finden ist.)

Demnächst erscheint ein Artikel von mir im dotnet.magazin über das Erstellen eines eigenen My Namespaces. Der My.Data Namespace bietet einfachen Zugriff auf eine im Vorhandene Datenbank. Der Artikel ist deswegen nur noch nicht fertig, weil das Deployment von My Extensions Probleme macht. Die Erweiterungen bestehen nämlich aus generiertem Code, der von den Projekteinstellungen abhängt, und kann deswegen nicht als Assembly verteilt werden. Es bleibt also nur noch ein Item-Template übrig für ein simples Deployment. Wenn man eine Vollintegration haben will, muss man wohl oder übel ein eigenes Add-In für Visual Studio schreiben. Das finde ich aber zu Aufwendig.

Auf der Basta 2007 Spring hatt ich mit Jay Schmelzer (Principal Program Manager Visual Basic) meine My.Data Erweiterung vorgestellt und mit ihm darüber gesprochen, wie man eigene My Erweiterungen in Visual Studio integrieren kann. Er versprach dies für Orcas mit einzuplanen.

Schade Jay, das war eigentlich nicht das, was ich mir vorgestellt hatte!



#If _MyType <> "Empty" Then
Namespace My
'''
''' Module used to define the properties that are available in the My Namespace for WPF
'''

'''
_
Module MyWpfExtension
Private m_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.Computer)
Private m_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.User)
Private m_Windows As New ThreadSafeObjectProvider(Of MyWindows)
Private m_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.Log)
'''
''' Returns the application object for the running application
'''

Friend ReadOnly Property Application() As Global.System.Windows.Application
Get
Return Global.System.Windows.Application.Current
End Get
End Property
'''
''' Returns information about the host computer.
'''

Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.Computer
Get
Return m_Computer.GetInstance()
End Get
End Property
'''
''' Returns information for the current user. If you wish to run the application with the current
''' Windows user credentials, call My.User.InitializeWithWindowsUser().
'''

Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.User
Get
Return m_User.GetInstance()
End Get
End Property
'''
''' Returns the application log. The listeners can be configured by the application's configuration file.
'''

Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.Log
Get
Return m_Log.GetInstance()
End Get
End Property
'''
''' Returns the collection of Windows defined in the project.
'''

Friend ReadOnly Property Windows() As MyWindows
_
Get
Return m_Windows.GetInstance()
End Get
End Property
_
_
Friend NotInheritable Class MyWindows
_
Private Shared Function Create__Instance__(Of T As {New, Global.System.Windows.Window})(ByVal Instance As T) As T
If Instance Is Nothing Then
If m_WindowBeingCreated IsNot Nothing Then
If m_WindowBeingCreated.ContainsKey(GetType(T)) = True Then
Throw New Global.System.InvalidOperationException("The window cannot be accessed via My.Windows from the Window constructor.")
End If
Else
m_WindowBeingCreated = New Global.System.Collections.Hashtable()
End If
m_WindowBeingCreated.Add(GetType(T), Nothing)
Return New T()
m_WindowBeingCreated.Remove(GetType(T))
Else
Return Instance
End If
End Function
_
Private Sub Dispose__Instance__(Of T As Global.System.Windows.Window)(ByRef instance As T)
instance = Nothing
End Sub
_
_
Public Sub New()
MyBase.New()
End Sub
Private Shared m_WindowBeingCreated As Global.System.Collections.Hashtable
Public Overrides Function Equals(ByVal o As Object) As Boolean
Return MyBase.Equals(o)
End Function
Public Overrides Function GetHashCode() As Integer
Return MyBase.GetHashCode
End Function
_
Friend Overloads Function [GetType]() As Global.System.Type
Return GetType(MyWindows)
End Function
Public Overrides Function ToString() As String
Return MyBase.ToString
End Function
End Class
End Module
End Namespace
#End If

Keine Kommentare: