fbpx

Dynamically loading XSharp assemblies

  • Arne Ortlinghaus
  • Arne Ortlinghaus's Avatar Topic Author
  • Away
More
1 year 11 months ago #1 by Arne Ortlinghaus
Dynamically loading XSharp assemblies was created by Arne Ortlinghaus
When trying to load XSharp assemblies with the command VulcanLoadLibrary I received error messages. When substituting this by the function below it works, at least for assemblies without the automatically called init procedures.

But I have seen that it is better to call all initialization manually in the program.
I have seen that runtime errors in the init procedures are very hard to identify, whereas when calling them in the program the runtime errors are displayed with reasonable messages on the screen.

function xsLoadLibrary(libPath as string) as System.Reflection.Assembly
local pdll as System.Reflection.Assembly
pdll := System.Reflection.Assembly.LoadFrom(libPath)
return pdll

Please Log in or Create an account to join the conversation.

More
1 year 11 months ago #2 by Chris Pyrgas
Replied by Chris Pyrgas on topic Dynamically loading XSharp assemblies
Hi Arne,

Thanks for reporting this, it is a bug (well, compatibility issue) in the compiler, as it generates assemblies with slightly different layout than VulcanLoadLibrary() expects. Should be easy enough to fix.

Chris

XSharp Development Team
chris(at)xsharp.eu

Please Log in or Create an account to join the conversation.

More
1 year 11 months ago #3 by Wolfgang Riedmann
Replied by Wolfgang Riedmann on topic Dynamically loading XSharp assemblies
Hi Arne,

use Reflection! Since X# currently does not need initializations like the Vulcan runtime, you should be able to do it.

I'm doing this regularly:
foreach cDLLName as string in oDLLs
  cFullPath := Path.Combine( cPath, cDLLName )                           
  oAssembly := Assembly.LoadFrom( cFullPath )
  oClasses := Utility.AssemblyClasses( oAssembly, "ProdConfigBase.IConfiguration" )
  foreach cClassName as string in oClasses
    oConfiguration := ( IConfiguration ) oAssembly:CreateInstance( cClassName )
    if oConfiguration != null
      ++nLoaded
      oConfiguration:Initialize( oWindow, ProgSettings.Language )
      if oConfiguration:LastException != null
        MessageBox.Show( string.Format( e"Error loading configuration DLL {0}\n\n{1}\n\n{2}", cDLLName, oConfiguration:LastException:Message, oConfiguration:LastException:StackTrace ) )  
      endif
      ProgSettings.ProduktConfigurations:Add( oConfiguration )
    endif
  next
next

Wolfgang

Please Log in or Create an account to join the conversation.