This example will not work in .NET core. From the book "Pro C# 9 with .NET 5":

Support for AppDomains is changed in .NET Core. In .NET Core, there is exactly one AppDomain. Creation
of new AppDomains is no longer supported because they require runtime support and are generally expensive to
create. 
Recently I wanted dynamically to load two different versions (18 and 30) of a component TX Text Control .NET for Windows Forms. First problem was that I was unable to load dynamically version 30 because of license problem. So, first I have loaded TX Text Control .NET for Windows Forms 30. Then I have dynamically loaded assemblies needed for TX Text Control .NET for Windows Forms 18.

First I have created a list of DLL's which I am gonna need:

private string[] listOfAssemblies = {
	"TXDocumentServer.dll"
	, "TXDocumentServer.Windows.Forms.dll"
	, "TXTextControl.dll"
	, "TXTextControl.Server.dll"
	, "TXTextControl.Windows.Forms.Design.dll"
	, "TXTextControl.Windows.Forms.dll"
};
If I want to have only one DLL from one version than I can siply use:
Assembly.LoadFile(assemblyPath);
In order to have both versions of assemblies loaded In order to be able to unload assembly I needed to create additional AppDomain:
AppDomainSetup domainInfo = new AppDomainSetup
{
	ApplicationBase = Environment.CurrentDirectory
};
Evidence evidence = AppDomain.CurrentDomain.Evidence;
AppDomain domain = AppDomain.CreateDomain("TXTextControl18Domain", evidence, domainInfo);

Type type = typeof(Proxy);
var value = (Proxy)domain.CreateInstanceAndUnwrap(
	type.Assembly.FullName,
	type.FullName);
Where Proxy is:
public class Proxy : MarshalByRefObject
{
	public Assembly GetAssembly(string assemblyPath)
	{
		try
		{
			return Assembly.LoadFile(assemblyPath);
		}
		catch (Exception)
		{
			return null;
			// throw new InvalidOperationException(ex);
		}
	}
}
Now, for example, I want to get list of types inside every assembly listed:
Assembly asm;
string path = @"C:\Program Files\Text Control GmbH\TX Text Control 18.0.NET for Windows Forms\Assembly";
foreach (string assembly in listOfAssemblies)
{
	asm = value.GetAssembly(Path.Combine(path, assembly));

	Type[] types = asm.GetTypes();
	foreach (Type t in types)
	{
	  Console.WriteLine("Type: {0}", t);
	}
}
Second example I want to load a file like:
textControl.Load("test.tx", StreamType.InternalFormat);
In order to do it, I need "TXTextControl.TextControl" and "TXTextControl.StreamType" like:
Assembly asm;
string path = @"C:\Program Files\Text Control GmbH\TX Text Control 18.0.NET for Windows Forms\Assembly";
Type textControlType = null;
Type streamType = null;
foreach (string assembly in listOfAssemblies)
{
	asm = value.GetAssembly(Path.Combine(path, assembly));

	if (textControlType is null)
	{
		textControlType = asm.GetType("TXTextControl.TextControl");
	}

	if (streamType is null)
	{
		streamType = asm.GetType("TXTextControl.StreamType");
	}
}
To get "StreamType.InternalFormat" I will do something like:
object internalFormat = Enum.Parse(streamType, "InternalFormat");
To get method load I will do something like:
object objTextControl = Activator.CreateInstance(textControlType);
var textControl = (Control)objTextControl;

textControl.Dock = DockStyle.Fill;
Controls.Add(textControl);


object internalFormat = Enum.Parse(streamType, "InternalFormat");
MethodInfo miLoadWithFileName = textControlType.GetMethod("Load", new [] {typeof(string), streamType});
if (!(miLoadWithFileName is null))
{
	miLoadWithFileName.Invoke(objTextControl, new[] { @"test.tx", internalFormat });
}
Same method with no paramaters:
MethodInfo miLoadWithoutParameters = textControlType.GetMethod("Load", Type.EmptyTypes);
if (!(miLoadWithoutParameters is null))
{
	miLoadWithoutParameters.Invoke(objTextControl, null);
}
Third example, I want ApplicationFields collection, and iterate through it. Normally I would use something like:
foreach (ApplicationField applicationField in textControl.ApplicationFields)
{
	Debug.WriteLine(applicationField.Text);
}
IEnumerable ApplicationFields I am gonna get like:
PropertyInfo piApplicationFields = textControlType.GetProperty("ApplicationFields");
if (!(piApplicationFields is null))
{
	applicationFieldsObject = piApplicationFields.GetValue(objTextControl, null);
}
IEnumerable applicationFields = applicationFieldsObject as IEnumerable;
Property Text from ApplicationField:
PropertyInfo piParameters = applicationFieldType.GetProperty("Text");
if (!(piParameters is null))
{
	object applicationFieldText = piParameters.GetValue(applicationField, null);
	Console.WriteLine(applicationFieldText);
}
Whole method:
object applicationFieldsObject = null;
Assembly asm;
Proxy value = DomainInstance();
string path = @"C:\Program Files\Text Control GmbH\TX Text Control 18.0.NET for Windows Forms\Assembly";

Type textControlType = null;
Type applicationFieldType = null;
foreach (string assembly in listOfAssemblies)
{
	asm = value.GetAssembly(Path.Combine(path, assembly));

	if (textControlType is null)
	{
		textControlType = asm.GetType("TXTextControl.TextControl");
	}

	if (applicationFieldType is null)
	{
		applicationFieldType = asm.GetType("TXTextControl.ApplicationField");
	}
}

object objTextControl = Activator.CreateInstance(textControlType);

Control textControl = (Control)objTextControl;

textControl.Dock = DockStyle.Fill;
Controls.Add(textControl);

MethodInfo miLoadWithoutParameters = textControlType.GetMethod("Load", Type.EmptyTypes);
if (!(miLoadWithoutParameters is null))
{
	miLoadWithoutParameters.Invoke(objTextControl, null);
}

PropertyInfo piApplicationFields = textControlType.GetProperty("ApplicationFields");
if (!(piApplicationFields is null))
{
	applicationFieldsObject = piApplicationFields.GetValue(objTextControl, null);
}

IEnumerable applicationFields = applicationFieldsObject as IEnumerable;

foreach (object applicationField in applicationFields)
{
	PropertyInfo piParameters = applicationFieldType.GetProperty("Text");
	if (!(piParameters is null))
	{
		object applicationFieldText = piParameters.GetValue(applicationField, null);
		Console.WriteLine(applicationFieldText);
	}
}
If I want to take string array of paramaters from application field for example:
PropertyInfo piParametersAppFld = applicationFieldType.GetProperty("Parameters");
if (!(piParametersAppFld is null))
{
	object parameters = piParametersAppFld.GetValue(applicationField, null);
	string[] paramatersAry = parameters as string[];
	foreach (string parameter in paramatersAry)
	{
		Console.WriteLine(parameter);
	}
}
To get Count property of ApplicationFields:
applicationFieldCollectionType = asm.GetType("TXTextControl.ApplicationFieldCollection");

PropertyInfo piCountAppFld = applicationFieldCollectionType.GetProperty("Count");
if (!(piCountAppFld is null)) 
{
	object appFldsCount = piCountAppFld.GetValue(applicationFieldsObject, null);
	Console.WriteLine((int)appFldsCount);
}
Example dowload from here.

EDIT: In order to force my app to work on a machine where I don't have TX Text Control installed, I had to change the file DynamicallyLoadingAssemblies.exe.config like:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	
	<runtime>
		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
		
			<dependentAssembly>
			   <assemblyIdentity name="txkernel" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.1800.500" href="C://myPathTo18Dlls//txkernel.dll" />
			</dependentAssembly>
			
			<dependentAssembly>
			   <assemblyIdentity name="txtools" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.404.500" href="C://myPathTo18Dlls//txtools.dll" />
			</dependentAssembly>			
		
			<dependentAssembly>
			   <assemblyIdentity name="TXDocumentServer" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.402.500" href="C://myPathTo18Dlls//TXDocumentServer.dll" />
			</dependentAssembly>
			
			<dependentAssembly>
			   <assemblyIdentity name="TXDocumentServer.Windows.Forms" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.101.500" href="C://myPathTo18Dlls//TXDocumentServer.Windows.Forms.dll" />
			</dependentAssembly>

			<dependentAssembly>
			   <assemblyIdentity name="TXTextControl" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.1100.500" href="C://myPathTo18Dlls//TXTextControl.dll" />
			</dependentAssembly>

			<dependentAssembly>
			   <assemblyIdentity name="TXTextControl.Server" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.300.500" href="C://myPathTo18Dlls//TXTextControl.Server.dll" />
			</dependentAssembly>

			<dependentAssembly>
			   <assemblyIdentity name="TXTextControl.Windows.Forms.Design" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.102.500" href="C://myPathTo18Dlls//TXTextControl.Windows.Forms.Design.dll" />
			</dependentAssembly>

			<dependentAssembly>
			   <assemblyIdentity name="TXTextControl.Windows.Forms" publicKeyToken="6b83fe9a75cfb638" Culture="neutral"/>
			   <codeBase version="18.0.300.500" href="C://myPathTo18Dlls//TXTextControl.Windows.Forms.dll" />
			</dependentAssembly>
			
		</assemblyBinding>
	</runtime>	
	
</configuration>