2

うさぎの穴を深く掘り下げる前に...簡単な質問...

出来ますか?

このレガシーシステムはVisualBasic6で作成されており、.NETへの移植を開始しており、署名なしで使用する必要があります。問題は、更新があるたびに共通ライブラリに署名する必要があることです。(共通ライブラリは異なる製品間で共有されます)。

すべてを瞬時に移植することはできないため、最初にサーバーの移植を開始しました。現在、Visual Basic UIがクライアントインターフェイスを呼び出せるように、クライアントインターフェイスをCOM表示するように設計しました。

私たちが持っている一般的なフレームワークdllは署名されておらず、現在多くのプロジェクトで利用されています。しかし、この製品については、再署名する必要があり、手間がかかりすぎます。

これが不可能な場合、ラッパーやこの問題を回避するためのテクニックなど、他の方法はありますか?

ありがとう。

4

1 に答える 1

3

私はこれが2つの理由でトリッキーになると思います(おそらくあなたはすでに発見していると思います):

  1. 署名されていないライブラリをregasmして、COMに公開することはできません。
  2. 署名されたライブラリから署名されていないライブラリを参照することはできません。

誰かがもっと良い考えを持っているかもしれませんが、これらの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に登録します。これで、これで完了です。非常に退屈ですが、あなたの制約を考えると、それが私が考えることができる唯一のことです。

推奨読書:

于 2012-08-14T05:59:07.400 に答える