私はこれが2つの理由でトリッキーになると思います(おそらくあなたはすでに発見していると思います):
- 署名されていないライブラリを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
ここで、署名されたアセンブリに戻り、次のような小さなヘルパーファクトリを追加します(これを行うのはオプションですが、これを1か所で行うのは良い考えだと思います)。
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に登録します。これで、これで完了です。非常に退屈ですが、あなたの制約を考えると、それが私が考えることができる唯一のことです。
推奨読書: