Použití typů COM (interoperability) v balíčcích aplikace Dynamo
Obecné informace o typech interoperability
Co jsou typy COM? – https://learn.microsoft.com/cs-cz/windows/win32/com/the-component-object-model
Standardním způsobem, jak používat typy COM v jazyce C#, je odkazovat a dodávat primární sestavení interoperability (v podstatě velká kolekce rozhraní API) s balíčkem.
Alternativou k tomu je vložení PIA (primary interop assemblies – primární sestavení interoperability) do spravovaného sestavení. To v podstatě zahrnuje pouze typy a členy, které jsou skutečně používány spravovaným sestavením. Tento přístup má však některé další problémy, jako je ekvivalence typů.
Tento článek tuto problematiku dobře popisuje:
Jak Dynamo spravuje ekvivalenci typů
Dynamo deleguje ekvivalenci typů na modul runtime .NET. Například 2 typy se stejným názvem a jmenným prostorem, pocházející z různých sestavení, nebudou považovány za ekvivalentní a Dynamo nahlásí chybu při načítání konfliktních sestavení. Pokud jde o typy interoperability, Dynamo zkontroluje, zda jsou ekvivalentní pomocí rozhraní API IsEquivalentTo.
Jak se vyhnout konfliktům mezi vloženými typy interoperability
Některé balíčky již byly vytvořeny s vloženými typy interoperability (např. CivilConnection). Načtení 2 balíčků s vloženými sestaveními interoperability, která nejsou považována za ekvivalentní (různé verze, jak je definováno zde), způsobí chybovou zprávu package load error
. Z tohoto důvodu doporučujeme, aby autoři balíčků používali pro typy interoperability dynamickou vazbu (tzv. pozdní vazbu) (řešení je také popsáno tady).
Můžete postupovat podle tohoto příkladu:
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