Using AppDomain.CreateInstanceAndUnwrap to create an instance of type T and then early binding to a method of type T
In the MSDN documentation for the AppDomain.CreateInstanceAndUnwrap method, it states as a note
If you make an early-bound call to a method M of an object of type T1 that was returned by CreateInstanceAndUnwrap, and that method makes an early-bound call to a method of an object of type T2 in an assembly C other than the current assembly or the assembly containing T1, assembly C is loaded into the current application domain. This loading occurs even if the early-bound call to T1.M() was made in the body of a DynamicMethod, or in other dynamically generated code. If the current domain is the default domain, assembly C cannot be unloaded until the process ends. If the current domain later attempts to load assembly C, the load might fail.
(http://msdn.microsoft.com/en-us/开发者_StackOverflowlibrary/3c4f1xde.aspx)
Does anyone have a technical explanation for the above note? Why is this the case? Is Assembly dependency lookup done when a method is first called on the object?
Assembly dependency is call when you're creating instance of the object.
Let's analyze hypothetical scenario. We have 2 DLLs: Lib1 and Lib2. (Lib1 uses methods from Lib2).
In our application main method looks as below:
Worker localWorker = new Worker();
localWorker.PrintDomain();
AppDomain ad = AppDomain.CreateDomain("New domain");
Worker remoteWorker = (Worker)ad.CreateInstanceAndUnwrap("Lib1","Lib1.Worker");
remoteWorker.PrintDomain();
Assembly dependency is checking in line:
Worker remoteWorker = (Worker)ad.CreateInstanceAndUnwrap("Lib1","Lib1.Worker");
For example if the Lib2.dll doesn't exist we'll get an exception.
精彩评论