在 Dynamo 软件包中使用 COM(互操作)类型
有关互操作类型的一些常规信息
什么是 COM 类型?- https://learn.microsoft.com/zh-cn/windows/win32/com/the-component-object-model
在 C# 中使用 COM 类型的标准方法是随包一起引用和交付主互操作程序集(基本上是一个大的 API 集合)。
另一种方法是将 PIA(主互操作程序集)嵌入到托管程序集中。这基本上只包括托管程序集实际使用的类型和成员。但是,这种方法还有一些其他问题,例如类型等效性。
这篇文章很好地描述了这个问题:
Dynamo 如何管理类型等效
Dynamo 将类型等效委派给 .NET (dotnet) 运行时。例如,来自不同程序集且具有相同名称和名称空间的 2 个类型不被视为等效,Dynamo 会在加载冲突的程序集时显示错误。对于互操作类型,Dynamo 将使用 IsEquivalentTo API 检查互操作类型是否等效
如何避免嵌入式互操作类型之间的冲突
某些软件包已使用嵌入式互操作类型(例如 CivilConnection)创建。加载 2 个软件包(其中包含不被视为等效的嵌入式互操作程序集(此处定义的不同版本)将导致 package load error
。因此,我们建议软件包作者对互操作类型使用动态绑定(也称为后期绑定)(解决方案也此处描述)。
您可以按照以下示例作:
public class Application
{
string m_sProdID = "SomeNamespace.Application";
public dynamic m_oApp = null; // Use dynamic so you do not need the PIA types
public Application()
{
this.GetApplication();
}
internal void GetApplication()
{
try
{
m_oApp = System.Runtime.InteropServices.Marshal.GetActiveObject(m_sProdID);
}
catch (Exception /*ex*/)
{}
}
}
}
Last updated