Reputation: 17793
Is it possible to run some code when an assembly is loaded, without doing anything specific in the loading code? What I am looking for is like a static constructor on a type.
Eg:
Assembly A does not know about Assembly B, but B does know about A. Assembly A needs to know certain things about B if B is loaded. When Assembly B is loaded by the runtime (referenced, or explicit), I want a piece of code (static method or attribute) to be executed that calls a method in Assembly A.
The root cause of this problem is unknown types being encountered when serializing a type in A that contains types from B not known at compile time as interfaces are used.
Upvotes: 46
Views: 21011
Reputation: 942178
The CLR supports module initializers. You'd have to hack C++/CLI code or ilasm.exe to use them.
UPDATE: directly supported in C# as well since .NET 5 with the [ModuleInitializer] attribute
Upvotes: 48
Reputation: 8168
There are 3 options to initialize a .NET Assembly:
Upvotes: 7
Reputation: 941
You can use static constructors in .Net, but unfortunately they don't do what you want. Static constructors are only executed just before a type is used. See http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx for details.
You might get some mileage from subscribing to your AppDomain's AssemblyLoad event. See http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx.
In your event handler you could reflect on the newly loaded assembly, and get it to execute whatever code you like.
Upvotes: 7
Reputation: 1063844
(edit - applies to C#; for a C++ approach, see this answer)
Basically, no: you can't. This would be a huge attack surface, and isn't allowed. You might want to put a static ctor on some of the B types that ensure the init code is executed, but that is about it...
Upvotes: 6
Reputation: 62397
You should probably revisit your serialization approach to mitigate this problem. If you serialize using ISerializable
and the SerializableAttribute
attribute, you can make it such that the serialization graph will load assembly B when necessary without assembly A ever having to explicitly know about assembly B.
Upvotes: 3