2012-08-14 98 views
2

在我深入挖掘兔子洞之前......一個簡單的問題......在COM中引用未簽名的.NET程序集(Visual Basic 6)

是否有可能?

我們在Visual Basic 6中創建了這個遺留系統,我們開始將它移植到.NET,並且我們希望它是未簽名的。問題是我們每次更新時都必須簽署共同的圖書館。 (通用庫在不同產品之間共享)。

由於我們無法立即移植所有內容,因此我們首先開始移植服務器。目前,我們將客戶端接口設計爲COM可見,以便Visual Basic UI可以調用它們。

我們擁有的通用框架DLL是無符號的,目前許多項目都使用它。但是對於這款產品,我們需要重新簽署,這是太多的工作要做。

如果這是不可能的,是否會有其他方式,如包裝,或一些技術來解決這個問題?

謝謝。

+0

兩個上下文問題; a:爲什麼它需要*被簽名 - 你使用GAC還是什麼? b:爲什麼你特別希望它是* unsigned *(簽名時很簡單)? – 2012-08-14 05:15:25

+0

雖然沒有詳細瞭解COM的可見性,但我最初的印象是需要對它進行簽名才能使其可見(如果不是,那麼這就解決了我的問題)^ _^ 我們設計的常見DLL是無符號的,因爲不同的公共服務互相引用。我們將每個更新設計爲向後兼容,因此我們不必重建受影響的項目。 – 2012-08-14 05:42:12

+0

和「b」? (關於信息,因爲你說你把它移植到.NET中,它既不明顯,也不表示你讓它看起來是可見的;因此「a」) – 2012-08-14 05:42:51

回答

3

我認爲這將是非常棘手的,因爲兩件事情(我猜你可能已經發現了):

  1. 不能regasm一個無符號庫,這樣就可以接觸到COM。
  2. 您不能從已簽名的庫中引用未簽名的庫。

也許有人有更好的想法,但給出的兩個約束條件,我認爲你能做的唯一的事情就是討厭的東西與反思...

假設你有一個無符號庫中的類要暴露於COM,看起來像這樣:

public class TestClass 
{ 
    public string SaySomething() 
    { 
     return "Hello"; 
    } 
} 

您可以從一個無符號的一個參考簽名的程序集,因此第一步可以爲您創造類的只是位要暴露給COM接口,並把這些接口在標誌的新組件中編號。在我們的例子說,因此我們定義的接口(可以擺弄各種COM屬性,使其根據自己的喜好):

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface ITestClass 
{ 
    string SaySomething(); 
} 

現在引用新的組裝,從原來的一個,改變類的定義,使其實現接口。

public class TestClass : ITestClass 

現在,回到你的簽名的程序集,並添加一個小幫手工廠,看起來像這樣(這是可選的做到這一點,但我覺得在一個地方做,這是一個好主意):

internal static class ClassFactory 
{ 
    // Depending on how you aer hosting this you can use a relative 
    // path here (maybe) - this gets a bit tricky to sort out and is 
    // most likely what will cause problems 
    private static readonly Assembly UnsignedAssembly = 
     Assembly.LoadFrom(@"C:\...\COMClassLibrary.dll"); 

    internal static T CreateClass<T>(string typeName) 
    { 
     return (T)Activator.CreateInstance(UnsignedAssembly.GetType(typeName)); 
    } 
} 

最後一步是創建類的包裹起來的版本,你可以接觸到COM像這樣:

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("MyClasses.TestClass")] 
public class TestClassWrapped : ITestClass 
{ 
    private readonly ITestClass _original; 

    public TestClassWrapped() 
    { 
     _original = ClassFactory.CreateClass<ITestClass>(
      "COMClassLibrary.TestClass"); 
    } 

    public string SaySomething() 
    { 
     return _original.SaySomething(); 
    } 
} 

現在使用regasm註冊你的簽名的程序集的COM和應該做的我噸。大量乏味,但考慮到你的限制,這是我能想到的唯一的事情。

推薦閱讀:

+0

哇...討厭...但我喜歡這個主意...... :)這是我正在尋找的包裝。我不知道是否有任何性能影響,但值得嘗試。謝啦 :) – 2012-08-14 06:11:16