I am loading all DLLs from a specific "extensions" directory in a new AppDomain to get some Reflection related information out of those.
This is what I'm trying:
I created a new library AssemblyProxy
in my solution which just has this class:
public class AssemblyProxy : MarshalByRefObject
{
public Assembly LoadFile( string assemblyPath )
{
try
{
return Assembly.LoadFile( assemblyPath );
}
catch
{
return null;
}
}
}
I make sure this DLL is present inside my "extensions" directory. Then I use the following code to load all assemblies from "extensions" directory into the new AppDomain
.
foreach( string extensionFile in Directory.GetFiles( ExtensionsDirectory, "*.dll" ) )
{
Type type = typeof( AssemblyProxy.AssemblyProxy );
var value = (AssemblyProxy.AssemblyProxy) Domain.CreateInstanceAndUnwrap(
type.Assembly.FullName,
type.FullName );
var extensionAssembly = value.LoadFile( extensionFile );
types.AddRange( extensionAssembly.GetTypes() );
}
Some DLLs do get loaded successfully but on some DLLs an exception is thrown like this:
Could not load file or assembly 'Drivers, Version=2.3.0.77, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
EDIT: The exception is not thrown in the new AppDomain. The DLL gets successfully loaded in the new AppDomain. The exception gets thrown as soon as the assembly reference is returned to the main/calling AppDomain. Does the main/calling AppDomain try to load the assembly on its own on just receiving the reference?
Thanks.
ReflectionLoadOnly
sufficient for your (untold) purposes? – CadmarrReflectionOnlyLoad
does load the assembly in the currentAppDomain
, just not its dependencies. As far as I am aware you cannot unload them from the currentAppDomain
. – FlyblownAssembly.LoadFrom
instead ofAssembly.LoadFile
. – OpsAssembly
. You will need to create a safe serializable/remotable object to transfer that info. As soon as a type crosses the boundary, you are screwed ;p – OpsAssembly
object? Because if I useReflectionOnlyLoadFrom
then an object reference of sameAssembly
type gets returned successfully. – Karolkarola