2012-10-07 56 views
0

我試圖使用預編譯的DLL與反思,以實例爲我的類的接口是在DLL反射麻煩。我嘗試了這本書,但它不會工作。它引發InvalidCastException當我嘗試做一些事情,如:InvalidCastException的,DLL和C#中

ICompute iCompute = (ICompute)Activator.CreateInstance(type); 

其中當然類型是我的類,它實現ICompute接口。我卡住了,不知道該怎麼辦。完整的代碼如下:

這是DLL內容:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication18 
{ 
    public class ClassThatImplementsICompute : ICompute 
    { 
     public int sumInts(int term1, int term2) 
     { 
      return term1 + term2; 
     } 

     public int diffInts(int term1, int term2) 
     { 
      return term1 - term2; 
     } 
    } 
} 

實際的程序:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.Reflection; 

namespace ConsoleApplication18 
{ 

    public interface ICompute 
    { 
     int sumInts(int term1, int term2); 
     int diffInts(int term1, int term2); 
    } 



    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Loading dll..."); 
      Assembly assembly = Assembly.LoadFrom("mylib.dll"); 

      Console.WriteLine("Getting type..."); 
      Type type = assembly.GetType("ConsoleApplication18.ClassThatImplementsICompute"); 
      if (type == null) Console.WriteLine("Could not find class type"); 

      Console.WriteLine("Instantiating with activator..."); 
      //my problem!!! 
      ICompute iCompute = (ICompute)Activator.CreateInstance(type); 

      //code that uses those functions... 



     } 
    } 
} 

誰能幫助我?謝謝!

+2

是'ICompute'聲明兩次?每次組裝一次?如果是這樣,那是你的問題。僅僅因爲兩個接口具有相同的成員不會使它們成爲相同的接口。 – vcsjones

+0

你有沒有嘗試使用.NET 4和動態?如果iCompute是動態的,那麼它可能工作。 –

+0

@vcsjones 起初我還以爲同一然後重新編譯我的DLL以這樣的方式 CSC /目標:庫/reference:Program.exe /out:mylib.dll ClassThatImplementsICompute.cs 我做了它可能是錯的方式第一次: CSC /目標:庫/out:mylib.dll Program.cs的ClassThatImplementsICompute.cs – TechInstinct

回答

1

的問題是你如何與Assembly.LoadFrom()加載程序集做。

LoadFrom()負荷組裝成不同的上下文相比ICompute接口您要投給的情境。如果可能,儘量使用Assembly.Load()。即將組件放入垃圾箱/探測路徑文件夾並以完整強名稱加載。

一些參考: http://msdn.microsoft.com/en-us/library/dd153782.aspx http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx(參見LoadFrom的缺點位)

+0

嘗試。不起作用。也許我以錯誤的方式編譯我的DLL? – TechInstinct

+0

具有ICompute接口的程序集是否已簽名?爲了正確投射。 ICompute接口需要來自同一個程序集,相同的物理文件具有相同的強名稱。我沒有嘗試類似沒有強名稱的東西,所以我不確定未簽名程序集的行爲。 – airmanx86

+0

呃,其實我不知道我是否明白你在問什麼。對不起,我對C#比較陌生。我創建了2個文件,其中的內容完全相同我的ICompute接口定義在Program.cs文件中,ClassThatImplementsICompute.cs文件中的ClassThatImplementsICompute。我使用命令行csc Program.cs編譯,然後使用ClassThatImplementsICompute.cs引用Program.exe來定義接口。精確的命令:** csc/target:library /reference:Program.exe /out:mylib.dll ClassThatImplementsICompute.cs **。有效。然後,我只是將mylib.dll移到了VS的Debug中,然後運行它。 – TechInstinct