我試圖重構一段代碼,並用盡了我能想到的選項。如何實例化一個COM類接口一般
這是原來的代碼,我有:
if (WebConfigSettings.ComPartition == null && HttpContext.Current != null)
Nses = new NSession();
else
Nses = (INSession)Marshal.BindToMoniker(string.Format("partition:{0}/new:NuntioServer.NSession", WebConfigSettings.ComPartition));
和
if (WebConfigSettings.ComPartition == null && HttpContext.Current != null)
apses.Wses = new WSession();
else
apses.Wses = (IWSession)Marshal.BindToMoniker(string.Format("partition:{0}/new:NuntioServer.WSession", WebConfigSettings.ComPartition));
這是怎麼我試圖重構它:
(是的,在C#中,你可以instantiateaninterface)
public static TInterface Get<TSubInterface, TInterface>() where TSubInterface: TInterface
{
<snip></snip>
if (!useComPartitions)
return Activator.CreateInstance<TSubInterface>(); // --> this is not cooperating
return (TInterface)Marshal.BindToMoniker(.....);
}
這是我已經嘗試過:
我試圖指定新的()約束,然後做一個「新TSubInterface()」: 這將導致生成錯誤:」 ..must是一個非抽象用公共無參數構造函數鍵入,以便將其用作通用類型或方法中的參數'TSubInterface'。「
當我使用Activator.CreateInstance時,我得到一個運行時異常:」無法創建一個實例接口「
當我使用Activator.CreateComInstanceFrom(」someAssemblyName「,」t ypeName「),我得到一個編譯錯誤:‘不能轉換表達式類型‘System.Runtime.Remoting.ObjectHandle’返回類型TInterface’
[編輯]我是能夠使加入該編譯'在哪裏TSubInterface:class,但我不確定這是否合理,因爲TSubInterface是一個接口。
使用CreateComInstanceFrom也不起作用,因爲它試圖找到在dll不是並且不應該是的目錄中指定的程序集。
我可以以某種方式使這個編譯和運行?
你使用這個方法的哪個代碼? –
nses = COMUtils.Get() NSession和INSession都是接口。 –
TweeZz
你想讓它工作只是因爲你可以或者你打算在生產代碼中使用它?如果另外一個人能夠通過控制容器的反轉來達到類似的目的,那麼他們會更好。 – Rafal