• Welcome to Powerbasic Museum 2020-B.
 

CCLRHost Class: Hosting the Common Language Runtime

Started by José Roca, August 30, 2011, 11:20:21 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

José Roca

 
CCLRHost is a class designed to host the .NET Common Language Runtime (CLR) in a PowerBASIC application and create and unwrap an instance of a COM visible .NET class whose methods and properties can be called using the PowerBASIC COM Automation statements.

The following example hosts the .NET 4 runtime in a PowerBASIC application, creates an instance of the System.Collections.Stack collection and calls its Push and Pop methods.


#COMPILE EXE
#DIM ALL
#INCLUDE ONCE "windows.inc"
#INCLUDE ONCE "CCLRHost.inc"

FUNCTION PBMAIN () AS LONG

   LOCAL pCLRHost AS ICLRHost
   LOCAL oStack AS DISPATCH
   LOCAL vRes AS VARIANT
   LOCAL vPrm AS VARIANT
   LOCAL bstrOutput AS WSTRING

   ' // Create an instance of the CCLRHost class
   pCLRHost = NewCLR4Host("v4.0.30319")   ' --> change version number if needed
   IF ISNOTHING(pCLRHost) THEN EXIT FUNCTION

   ' // Create an instance of the Stack collection
   oStack = pCLRHost.CreateInstance("mscorlib", "System.Collections.Stack")
   IF ISOBJECT(oStack) THEN
      ' Push and Pop some strings
      vPrm = "rocks!"
      OBJECT CALL oStack.Push(vPrm)
      vPrm = "PB"
      OBJECT CALL oStack.Push(vPrm)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput = VARIANT$$(vRes)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput += " " & VARIANT$$(vRes)
      MSGBOX bstrOutput
      oStack = NOTHING
   END IF

   pCLRHost = NOTHING

END FUNCTION


José Roca

 
Same as above, but using the .NET 2 runtime.


#INCLUDE "CCLRHost.inc"

' ========================================================================================
' Main
' ========================================================================================
FUNCTION PBMAIN () AS LONG

   LOCAL pCLRHost AS ICLRHost
   LOCAL oStack AS DISPATCH
   LOCAL vRes AS VARIANT
   LOCAL vPrm AS VARIANT
   LOCAL bstrOutput AS WSTRING

   ' // Create an instance of the CCLRHost class
   pCLRHost = NewCLRHost("v2.0.50727", "wks")
   IF ISNOTHING(pCLRHost) THEN EXIT FUNCTION

   ' // Create an instance of the Stack collection
   oStack = pCLRHost.CreateInstance("mscorlib", "System.Collections.Stack")
   IF ISOBJECT(oStack) THEN
      ' Push and Pop some strings
      vPrm = "rocks!"
      OBJECT CALL oStack.Push(vPrm)
      vPrm = "PB"
      OBJECT CALL oStack.Push(vPrm)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput = VARIANT$$(vRes)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput += " " & VARIANT$$(vRes)
      MSGBOX bstrOutput
      oStack = NOTHING
   END IF

   pCLRHost = NOTHING

END FUNCTION
' ========================================================================================


José Roca

 
The following version allows to use your own domain, instead of the default domain.


#INCLUDE "CCLRHost.inc"

' ========================================================================================
' Main
' ========================================================================================
FUNCTION PBMAIN () AS LONG

   LOCAL pCLRHost AS ICLRHost
   LOCAL pDomain AS SystemAppDomain

   LOCAL oStack AS DISPATCH
   LOCAL vRes AS VARIANT
   LOCAL vPrm AS VARIANT
   LOCAL bstrOutput AS WSTRING

   ' // Create and instance of the CCLRHost class and initialize it
   pCLRHost = NewCLRHost("v2.0.50727", "wks")
   IF ISNOTHING(pCLRHost) THEN EXIT FUNCTION

   ' // Create a custom domain
   pDomain = pCLRHost.CreateDomain("MyDomain")

   ' // Create an instance of the Stack collection
   oStack = pCLRHost.CreateInstance2(pDomain, "mscorlib", "System.Collections.Stack")
   IF ISOBJECT(oStack) THEN
      ' // Push and Pop some strings
      vPrm = "rocks!"
      OBJECT CALL oStack.Push(vPrm)
      vPrm = "PB"
      OBJECT CALL oStack.Push(vPrm)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput = VARIANT$$(vRes)
      OBJECT CALL oStack.Pop TO vRes
      bstrOutput += " " & VARIANT$$(vRes)
      MSGBOX bstrOutput
      oStack = NOTHING
   END IF

   pCLRHost.UnloadDomain(pDomain)

   pDomain = NOTHING
   pCLRHost = NOTHING

END FUNCTION
' ========================================================================================