Jump to content

.NET compiled dll assembly in AutoIt, the simple approach!


guinness
 Share

Recommended Posts

all at zip file

Thanks. Much obliged.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Next problem is that you have to be an administrator to register the com dll. This is not a great deal when registering once, but if you register and unregister it on the fly this is annoying if UAC is active. You also can check if registering worked fine with the exit code from RegAsm.exe. 0 means OK, exit code 100 means an error while registering occurred.

Local $RegError = RunWait($sRegAsmPath & ' /codebase ' & $sDllPath, @ScriptDir, @SW_HIDE) ; Register the .NET Dll.

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Link to comment
Share on other sites

Do have documentation of this, as I couldn't find the exit codes.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

I researched a bit and have now a solution. By using this lines I can register dll without being an admin:

RunWait($sRegAsmPath & ' /codebase ' & $sDllPath & ' /regfile:' & $sDllPath & '.reg', @ScriptDir, @SW_HIDE) ; Register the .NET Dll.
_ReplaceStringInFile($sDllPath & '.reg', 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER\Software\Classes')
RunWait('reg import ' & $sDllPath & '.reg', @ScriptDir, @SW_HIDE) ; Import to current users classes

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Link to comment
Share on other sites

What about unregistering?

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Unregistering works with your code only one path is left in registry that can be deleted automatically if you want.

Edited by funkey

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Link to comment
Share on other sites

Thanks. I will look at this in due course.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Here is my solution to this problem. I made a 2D array for dll name and clsid. Another solution would be enumeration of the reg keys.

Hope this works as expected for everyone.

#include <File.au3>

Global Enum $DOTNET_PATHS_INDEX, $DOTNET_PATHS_START, $DOTNET_LOADDLL, $DOTNET_UNLOADDLL, $DOTNET_UNLOADDLLALL, $DOTNET_PATHS_MAX = 100 ; Enumeration used for the _DotNet_* functions.

#cs
    NOTE: Don't forget to add [ComVisible(true)]  to the top of the class in the class library. Otherwise it won't work.
#ce

Example() ; A simple example of registering and unregistering the AutoIt.dll

Func Example()
    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    Local $Success = _DotNet_Load('AutoIt.dll')
    If $Success Then ; Load the .NET compiled dll.
        Local $oPerson1 = ObjCreate('AutoIt.Person') ; Namespace.Class.
        If IsObj($oPerson1) Then
            $oPerson1.Name = "funkey"
            $oPerson1.Age = 33
            ConsoleWrite('Person''s age => ' & $oPerson1.Age & @CRLF)
            $oPerson1.IncreaseAge() ; A silly method to show the encapsulation of the object around the Age property.
            ConsoleWrite('Person''s new age => ' & $oPerson1.Age & @CRLF)
            ConsoleWrite($oPerson1.ToString() & @CRLF) ; Call the ToString() method which was overriden.
        Else
            ConsoleWrite('An error occurred when using the Dll.' & @CRLF)
        EndIf
    Else
        ConsoleWrite('An error occurred when registering the Dll.' & @CRLF & 'Error: ' & @error & @CRLF)
    EndIf
    ; The dll is automatically unloaded when the application closes.
EndFunc   ;==>Example

; #FUNCTION# ====================================================================================================================
; Name ..........: _DotNet_Load
; Description ...: Load a .NET compiled dll assembly.
; Syntax ........: _DotNet_Load($sDllPath)
; Parameters ....: $sDllPath            - A .NET compiled dll assembly located in the @ScriptDir directory.
; Return values .: Success: True
;                  Failure: False and sets @error to non-zero:
;                       1 = Incorrect filetype aka not a dll.
;                       2 = Dll does not exist in the @ScriptDir location.
;                       3 = .NET RegAsm.exe file not found.
;                       4 = Dll already registered.
; Author ........: guinness
; Example .......: Yes
; ===============================================================================================================================
Func _DotNet_Load($sDllPath)
    Local $bReturn = __DotNet_Wrapper($sDllPath, $DOTNET_LOADDLL)
    Return SetError(@error, @extended, $bReturn)
EndFunc   ;==>_DotNet_Load

; #FUNCTION# ====================================================================================================================
; Name ..........: _DotNet_Unload
; Description ...: Unload a previously registered .NET compiled dll assembly.
; Syntax ........: _DotNet_Unload($sDllPath)
; Parameters ....: $sDllPath            - A .NET compiled dll assembly located in the @ScriptDir directory.
; Return values .: Success: True
;                  Failure: False and sets @error to non-zero:
;                       1 = Incorrect filetype aka not a dll.
;                       2 = Dll does not exist in the @ScriptDir location.
;                       3 = .NET RegAsm.exe file not found.
;                       4 = Dll already registered.
;                       5 = Maximum DLL count prepared to be used reached.
; Author ........: guinness
; Example .......: Yes
; ===============================================================================================================================
Func _DotNet_Unload($sDllPath)
    Local $bReturn = __DotNet_Wrapper($sDllPath, $DOTNET_UNLOADDLL)
    Return SetError(@error, @extended, $bReturn)
EndFunc   ;==>_DotNet_Unload

; #FUNCTION# ====================================================================================================================
; Name ..........: _DotNet_UnloadAll
; Description ...: Unload all previously registered .NET compiled dll assemblies.
; Syntax ........: _DotNet_UnloadAll()
; Parameters ....: None
; Return values .: Success: True
;                  Failure: False and sets @error to non-zero:
;                       1 = Incorrect filetype aka not a dll.
;                       2 = Dll does not exist in the @ScriptDir location.
;                       3 = .NET RegAsm.exe file not found.
;                       4 = Dll already registered.
; Author ........: guinness
; Example .......: Yes
; ===============================================================================================================================
Func _DotNet_UnloadAll()
    Local $bReturn = __DotNet_Wrapper(0, $DOTNET_UNLOADDLLALL)
    Return SetError(@error, @extended, $bReturn)
EndFunc   ;==>_DotNet_UnloadAll

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name ..........: __DotNet_Wrapper
; Description ...: A wrapper for the _DotNet_* functions.
; Syntax ........: __DotNet_Wrapper($sDllPath, $iType)
; Parameters ....: $sDllPath            - A .NET compiled dll assembly located in the @ScriptDir directory.
;                  $iType               - A $DOTNET_* constant.
; Return values .: Success: True
;                  Failure: False and sets @error to non-zero:
;                       1 = Incorrect filetype aka not a dll.
;                       2 = Dll does not exist in the @ScriptDir location.
;                       3 = .NET RegAsm.exe file not found.
;                       4 = Dll already registered.
;                       5 = Maximum DLL count prepared to be used reached.
; Author ........: guinness
; Remarks .......: ### DO NOT INVOKE, AS THIS IS A WRAPPER FOR THE ABOVE FUNCTIONS. ###
; Related .......: Thanks to Bugfix for the initial idea: http://www.autoitscript.com/forum/topic/129164-create-a-net-class-and-run-it-as-object-from-your-autoit-script/?p=938459
; Example .......: Yes
; ===============================================================================================================================
Func __DotNet_Wrapper($sDllPath, $iType)
    Local Static $aDllPaths[$DOTNET_PATHS_MAX][2] = [[0]], _
            $sRegAsmPath = 0

    If Not ($iType = $DOTNET_UNLOADDLLALL) Then
        If Not (StringRight($sDllPath, StringLen('dll')) == 'dll') Then ; Check the correct filetype was passed.
            Return SetError(1, 0, False) ; Incorrect filetype.
        EndIf
        If Not FileExists($sDllPath) Then ; Check the filepath exists in @ScriptDir.
            Return SetError(2, 0, False) ; Filepath does not exist.
        EndIf
    EndIf

    If $sRegAsmPath == 0 Then
        $sRegAsmPath = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework', 'InstallRoot')
        If @error Then
            $sRegAsmPath = '' ; Set to an empty string to acknowledge that searching for the path happened.
        Else
            Local $aFilePaths = _FileListToArray($sRegAsmPath, '*', 2), _
                    $sNETFolder = ''
            If Not @error Then
                For $i = UBound($aFilePaths) - 1 To 1 Step -1
                    If StringRegExp($aFilePaths[$i], '(?:[vV]4\.0\.\d+)') Then
                        $sNETFolder = $aFilePaths[$i]
                        ExitLoop
                    ElseIf StringRegExp($aFilePaths[$i], '(?:[vV]2\.0\.\d+)') Then
                        $sNETFolder = $aFilePaths[$i]
                        ExitLoop
                    EndIf
                Next
            EndIf
            $sRegAsmPath &= $sNETFolder & '\RegAsm.exe'
            If FileExists($sRegAsmPath) Then
                OnAutoItExitRegister("_DotNet_UnloadAll") ; Register when the AutoIt executable is closed.
            Else
                $sRegAsmPath = '' ; Set to an empty string to acknowledge that searching for the path happened.
            EndIf
        EndIf
    EndIf

    If $sRegAsmPath == '' Then
        Return SetError(3, 0, False) ; .NET Framework 2.0 or 4.0 required.
    EndIf

    Switch $iType
        Case $DOTNET_LOADDLL
            Local $iIndex = -1
            For $i = $DOTNET_PATHS_START To $aDllPaths[$DOTNET_PATHS_INDEX][0]
                If $sDllPath = $aDllPaths[$i][0] Then
                    Return SetError(4, 0, False) ; Dll already registered.
                EndIf
                If $iIndex = -1 And $aDllPaths[$i][0] == '' Then
                    $iIndex = $i
                EndIf
            Next

            If $iIndex = -1 Then
                $aDllPaths[$DOTNET_PATHS_INDEX][0] += 1
                $iIndex = $aDllPaths[$DOTNET_PATHS_INDEX][0]
            EndIf
            Local Const $iUBound = UBound($aDllPaths, 1)
            If $aDllPaths[$DOTNET_PATHS_INDEX][0] >= $iUBound Then
                ;ReDim $aDllPaths[Ceiling($iUBound * 1.3)]
                ;ReDim of static variables does not work on v3.3.8.1
                $aDllPaths[$DOTNET_PATHS_INDEX][0] -= 1
                Return SetError(5, 0, False) ; Maximum DLL count prepared to be used reached.

            EndIf
            $aDllPaths[$iIndex][0] = $sDllPath

            RunWait($sRegAsmPath & ' /s /codebase ' & $sDllPath & ' /regfile:' & $sDllPath & '.reg', @ScriptDir, @SW_HIDE) ; Export AsmInfo to .reg file
            _ReplaceStringInFile($sDllPath & '.reg', 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER\Software\Classes')
            RunWait('reg import ' & $sDllPath & '.reg', @ScriptDir, @SW_HIDE) ; Import to current users classes
            Local $hRegFile = FileOpen($sDllPath & '.reg', 0)
            Local $sRegFile = FileRead($hRegFile)
            FileClose($hRegFile)
            Local $aRegFile = StringSplit($sRegFile, @CRLF, 3)
            For $i = 0 To UBound($aRegFile) -1
                If StringLeft($aRegFile[$i], 4) == '@="{' Then
                    $aDllPaths[$iIndex][1] = StringTrimRight(StringTrimLeft($aRegFile[$i], 3), 1)
                    ExitLoop
                EndIf
            Next

            FileDelete($sDllPath & '.reg')

        Case $DOTNET_UNLOADDLL
            For $i = $DOTNET_PATHS_START To $aDllPaths[$DOTNET_PATHS_INDEX][0]
                If $sDllPath = $aDllPaths[$i][0] And Not ($aDllPaths[$i][0] == 0) Then
                    RunWait($sRegAsmPath & ' /s /unregister ' & $aDllPaths[$i][0], @ScriptDir, @SW_HIDE) ; Unregister the .NET Dll.
                    RegDelete('HKCU\Software\Classes\CLSID\' & $aDllPaths[$i][1])   ;64Bit path
                    RegDelete('HKCR\Wow6432Node\CLSID\' & $aDllPaths[$i][1])        ;32Bit path
                    $aDllPaths[$i][0] = 0 ; Remove item.
                    $aDllPaths[$i][1] = 0 ; Remove item.

                EndIf
            Next

        Case $DOTNET_UNLOADDLLALL
            If $sDllPath == 0 And $aDllPaths[$DOTNET_PATHS_INDEX][0] > 0 Then
                For $i = $DOTNET_PATHS_START To $aDllPaths[$DOTNET_PATHS_INDEX][0]
                    If Not ($aDllPaths[$i][0] == 0) Then
                        RunWait($sRegAsmPath & ' /s /unregister ' & $aDllPaths[$i][0], @ScriptDir, @SW_HIDE) ; Unregister the .NET Dll.
                        RegDelete('HKCU\Software\Classes\CLSID\' & $aDllPaths[$i][1])   ;64Bit path
                        RegDelete('HKCR\Wow6432Node\CLSID\' & $aDllPaths[$i][1])        ;32Bit path
                        $aDllPaths[$i][0] = 0 ; Remove item.
                        $aDllPaths[$i][1] = 0 ; Remove item.
                    EndIf
                Next
                $aDllPaths[$DOTNET_PATHS_INDEX][0] = 0 ; Reset the count.
            EndIf
    EndSwitch

    Return True
EndFunc   ;==>__DotNet_Wrapper

Func _ErrFunc($oError)
    ConsoleWrite("err.number is: " & @TAB & $oError.number & " / 0x" & Hex($oError.number, 8) & @CRLF & _
            "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            "err.description is: " & @TAB & $oError.description & @CRLF & _
            "err.source is: " & @TAB & $oError.source & @CRLF & _
            "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

Edit: Lost one line of code ;)

Edited by funkey

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Link to comment
Share on other sites

both work perfect on xp and server 2003

 

error check works to

Great my next version will be slightly different from funkey's. Doing a re-write this second.

Also with funkey's you can only register a max of 100 paths, due to them supporting a version of AutoIt which came out 3 years ago.

Edited by guinness

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Updated with the ideas presented by funkey. Thanks.

NOTE: This works in v3.3.10.0+. To port to an older version is fairly simple, but I would rather move forwards with the language and not backwards.

Edited by guinness

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

  • 1 month later...

Why i can't load HtmlAgilityPack.dll?

The _DotNet_Load returns True, but creating HtmlAgilityPack.HtmlDocument object has faild.

Func Example()
    Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    Local $Success = _DotNet_Load('HtmlAgilityPack.dll')
    If $Success Then ; Load the .NET compiled dll.
        Local $oPerson1 = ObjCreate('HtmlAgilityPack.HtmlDocument') ; Namespace.Class.
        If IsObj($oPerson1) Then
            ConsoleWrite('OK' & @LF)
        Else
            ConsoleWrite('An error occurred when using the Dll.' & @CRLF)
        EndIf
    Else
        ConsoleWrite('An error occurred when registering the Dll.' & @CRLF & 'Error: ' & @error & @CRLF)
    EndIf
    ; The dll is automatically unloaded when the application closes.
EndFunc

With the same dll (attached) i have been able to create the object using powershell:

Add-Type -Path "HtmlAgilityPack.dll"
$doc = New-Object HtmlAgilityPack.HtmlDocument

any ideas?

HtmlAgilityPack.zip

 

Spoiler

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

Spoiler

AutoIt_Icon_small.pngProjects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize Program

AutoIt_Icon_small.pngUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF
 
AutoIt_Icon_small.pngExamples: 
ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo

Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

 

 

 

AutoIt is simple, subtle, elegant. © AutoIt Team

Link to comment
Share on other sites

  • 2 weeks later...

Did you follow what I said in the first post? Especially about ComVisible?

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

  • 3 years later...

Hello.

I needed this to use WinSCP from AutoIt, but I'll be doing that in several scripts, and potentially more in the future. I didn't want to depend on copying the DLL each time for each script, and instead of that I wanted to rely on the static installation of WinSCP. So I slightly modified the functions to allow $sDllPath to be a full path.

Basically I added double quotes to the registration / unregistration commands and added some intelligence to not screw $sTempDllPath when using a full path. Added this in the description of the functions too, so check it out and see if you're happy with it.

DotNetAssembly.au3

Link to comment
Share on other sites

On 1/12/2015 at 4:57 AM, guinness said:

The ZIP file contains all related source code for both AutoIt and .NET.

Dot-NET Assembly in AutoIt.zip

Edited July 26, 2015 by guinness

I've run the example but it did not load the .dll and @error:0, @extended:0   =(
( let it be known that I have no clue of .NET, just running out of the ZIP )

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...