[Mono-list] Assembly.LoadFrom() - Assembly.CreateInstance() - Activator.CreateInstanceFrom() ---> invalid cast

Timothy Parez tpsoftware@users.sourceforge.net
Tue, 27 Jan 2004 12:49:25 +0100


Jaroslaw Kowalski wrote:

>Hi Timothy,
>
>I found the reason why this isn't working (and solution). This applies to MS
>.NET and is related to assembly versioning but I thought it might be
>interesting.
>
>Sorry for quite a long post.
>
>REPRODUCING THE PROBLEM:
>
>1. I grabbed "ByteFX.Data" from "mcs" and created a VS.NET 2003 project, and
>compiled it (obviously using .NET 1.1.4322).
>2. Among other things "ildasm ByteFX.Data.dll" shows a reference to
>System.Data that comes with .NET 1.1
>
>.assembly extern System.Data
>{
>  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         //
>.z\V.4..
>  .ver 1:0:5000:0
>}
>
>3. I created a test file: "test.cs"
>---------------
>using System;
>using System.Reflection;
>using System.Data;
>
>public class Class1
>{
>    public static void Main()
>    {
>        Assembly DataProvider;
>        DataProvider = Assembly.LoadFrom(@"bytefx\ByteFX.Data.dll");
>        object dbConnection =
>DataProvider.CreateInstance("ByteFX.Data.MySqlClient.MySqlConnection",false)
>;
>        Console.WriteLine(dbConnection.ToString());
>        IDbConnection dbConn = (IDbConnection)dbConnection;
>    }
>}
>---------------
>4. I have both MS.NET 1.0 and 1.1 and csc.exe from 1.0.3705 happens to be in
>my path. So when I compiled test.cs by:
>
>csc test.cs
>
>it referenced all libraries from .NET 1.0. "ildasm test.exe" shows:
>
>.assembly extern System.Data
>{
>  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         //
>.z\V.4..
>  .ver 1:0:3300:0
>}
>
>5. When I run test.exe I get invalid cast exception.
>
>HERE'S WHY:
>
>a) IDbConnection in test.cs acually means (using assembly-qualified type
>names)
>System.Data.IDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral,
>PublicKeyToken=b77a5c561934e089, Custom=null
>b) IDbConnection in "ByteFX.Data.dll" IDbConnection means:
>System.Data.IDbConnection, System.Data, Version=1.0.5000.0, Culture=neutral,
>PublicKeyToken=b77a5c561934e089, Custom=null
>c) Under .NET 1.0 the types aren't compatible and you have to provide
>assembly redirection to get it working.
>d) Under .NET 1.1 things have changed, and every time you ask for ANY type
>from ANY assembly that shipped with MS.NET 1.1 (regardless of the version)
>you always get the one that comes with .NET 1.1.
>
>SOLUTION:
>
>a) Recompile "test.cs" with csc.exe that comes with .NET 1.1. (In general -
>use the same compiler for both library and an exe)
>OR (when you want to run this on .NET 1.0)
>b) Create a config file "test.exe.config"
>
><configuration>
>   <runtime>
>      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
>         <dependentAssembly>
>            <assemblyIdentity name="System.Data"
>                              publicKeyToken="b77a5c561934e089"
>                              culture="neutral" />
>            <bindingRedirect oldVersion="1.0.5000.0"
>                             newVersion="1.0.3300.0"/>
>         </dependentAssembly>
>      </assemblyBinding>
>   </runtime>
></configuration>
>
>that will redirect all request to System.Data to version that comes with
>.NET 1.0
>
>c) Note that when you compile test.cs for .NET 1.1 you don't need the config
>file even if the ByteFX.Data was compiled against .NET 1.0 System.Data.dll
>because of the auto-redirection feature from 1.1.
>
>MY ADVICE:
>
>Use Activator.CreateInstance() and pass it the full name of the type you
>want to create. Something like:
>
>Activator.CreateInstance(Type.GetType("ByteFX.Data.MySqlClient.MySqlConnecti
>on, ByteFX.Data"))
>
>This works like a charm provided that ByteFX.Data.dll is in your application
>directory or in assembly probe path.
>
>Jarek
>
>_______________________________________________
>Mono-list maillist  -  Mono-list@lists.ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list
>
>  
>

Thnx, that helped a lot
I hope you don't mind me copying your e-mail to my site

Thnx.