Te diría la forma más sencilla de hacerlo en 2 simples líneas usando Batch, bueno, usando el comando nativo de Windows "FTYPE" + ASSOC, y podrías usar "process.start" para hacerlo, pero creo que se me echarían encima xD y no quiero usar malas costumbres.
Primero tienes que registrar la extensión en el registro (Cuando digo registrar simplemente me refiero a crear la subclave en la rama HKEY_CLASSES_ROOT)
Y por último tienes que associar la extensión al programa que desees.
Por último déjame decirte que existen conversores de C# a VB.NET, y este es el code que te ha ofrecido $Edu$ convertido:
Imports Microsoft.Win32
Imports System.Runtime.InteropServices
Public Class FileAssociation
' Associate file extension with progID, description, icon and application
Public Shared Sub Associate(extension As String, progID As String, description As String, icon As String, application As String)
Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID)
If progID IsNot Nothing AndAlso progID.Length > 0 Then
Using key As RegistryKey = Registry.ClassesRoot.CreateSubKey(progID)
If description IsNot Nothing Then
key.SetValue("", description)
End If
If icon IsNot Nothing Then
key.CreateSubKey("DefaultIcon").SetValue("", ToShortPathName(icon))
End If
If application IsNot Nothing Then
key.CreateSubKey("Shell\Open\Command").SetValue("", ToShortPathName(application) + " ""%1""")
End If
End Using
End If
End Sub
' Return true if extension already associated in registry
Public Shared Function IsAssociated(extension As String) As Boolean
Return (Registry.ClassesRoot.OpenSubKey(extension, False) IsNot Nothing)
End Function
<DllImport("Kernel32.dll")> _
Private Shared Function GetShortPathName(lpszLongPath As String, <Out> lpszShortPath As StringBuilder, cchBuffer As UInteger) As UInteger
End Function
' Return short path format of a file name
Private Shared Function ToShortPathName(longName As String) As String
Dim s As New StringBuilder(1000)
Dim iSize As UInteger = CType(s.Capacity, UInteger)
Dim iRet As UInteger = GetShortPathName(longName, s, iSize)
Return s.ToString()
End Function
End Class
EDITO:
He probado el code y no me ha funcionado en Windows7, escribe datos corruptos para el valor "icono" y "program", por ejemplo al usarlo así:
Associate(".Happy", "Notepad", "Happy Textfile", "notepad.exe,0", "notepad.exe")
En lugar de escribir "Notepad.exe", esto es lo que escribe en el registro:
P+^ "%1"Creo que el error sucede sólamente si tienes los nombres cortos desactivados en el sistema (como en mi caso),
la forma de arreglarlo es eliminando
ToShortPathName en el código, y eliminar la función ToShortPathName que al no ser llamada ya no nos sirve para nada,
me parece una tontería que lo hayan puesto,
y ya con eso anda bien en mi caso
.
PD: Gracias por el code $Edu$