我认为这会很棘手,因为有两件事(我猜你可能已经发现了):
- 您不能对未签名的库进行 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 注册您的签名程序集,这样就可以了。非常乏味,但考虑到您的限制,这是我唯一能想到的。
推荐阅读: