2

在我深入研究兔子洞之前......一个快速的问题......

是否可以?

我们在 Visual Basic 6 中创建了这个遗留系统,我们开始将它移植到 .NET,我们希望它是未签名的。问题是我们每次有更新时都必须签署我们的公共库。(公共库在不同产品之间共享)。

由于我们无法立即移植所有内容,因此我们首先开始移植服务器。目前,我们将客户端接口设计为 COM 可见,以便 Visual Basic UI 可以调用它们。

我们拥有的通用框架 dll 是未签名的,目前许多项目都在使用它。但是对于这个产品,我们需要重新签名,这是太多的工作要做。

如果这是不可能的,是否有任何其他方式,如包装,或一些技术来解决这个问题?

谢谢。

4

1 回答 1

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 注册您的签名程序集,这样就可以了。非常乏味,但考虑到您的限制,这是我唯一能想到的。

推荐阅读:

于 2012-08-14T05:59:07.400 回答