我認爲這將是非常棘手的,因爲兩件事情(我猜你可能已經發現了):
- 不能regasm一個無符號庫,這樣就可以接觸到COM。
- 您不能從已簽名的庫中引用未簽名的庫。
也許有人有更好的想法,但給出的兩個約束條件,我認爲你能做的唯一的事情就是討厭的東西與反思...
假設你有一個無符號庫中的類要暴露於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和應該做的我噸。大量乏味,但考慮到你的限制,這是我能想到的唯一的事情。
推薦閱讀:
來源
2012-08-14 05:59:07
kmp
兩個上下文問題; a:爲什麼它需要*被簽名 - 你使用GAC還是什麼? b:爲什麼你特別希望它是* unsigned *(簽名時很簡單)? – 2012-08-14 05:15:25
雖然沒有詳細瞭解COM的可見性,但我最初的印象是需要對它進行簽名才能使其可見(如果不是,那麼這就解決了我的問題)^ _^ 我們設計的常見DLL是無符號的,因爲不同的公共服務互相引用。我們將每個更新設計爲向後兼容,因此我們不必重建受影響的項目。 – 2012-08-14 05:42:12
和「b」? (關於信息,因爲你說你把它移植到.NET中,它既不明顯,也不表示你讓它看起來是可見的;因此「a」) – 2012-08-14 05:42:51