![](/img/trans.png)
[英]In C# COM projects, should I reference DLLs or TLBs? (Mainly SolidWorks)
[英]C# / inherit methods and properties from COM Reference (SolidWorks API)
我正在使用帶有C#的SolidWorks API。
通過向項目添加一系列COM引用,將其合並到Visual Studio中。 API附帶了各種類。 我想創建一個子類,它將方法添加到API附帶的類中,以便為超類添加功能。
下面的代碼顯示了沒有API的簡單示例。 它當然可以正常工作。
public class x
{
public double a;
}
public class y : x
{
public double b;
public void setAandB(double aa, double bb)
{
this.a = aa;
this.b = bb;
}
}
這是我嘗試使用子類添加方法的示例。 超類是SketchPoint 。
public class SketchPointWriter : SketchPoint
{
public void writeXML(XmlWriter writer, string nameElement)
{
writer.WriteStartElement(nameElement);
writer.WriteString(Convert.ToString(((SketchPoint)this).X * 1000.0) + ", ");
writer.WriteString(Convert.ToString(((SketchPoint)this).Y * 1000.0) + ", ");
writer.WriteString(Convert.ToString(((SketchPoint)this).Z * 1000.0));
writer.WriteEndElement();
}
}
API中的SketchPoint無法將自身寫入XML文件。 所以,我想通過創建一個子類,繼承所有超類的屬性和方法,然后添加我的新方法,將這個功能添加到類中。
請注意, 這個明確的類型轉換。 如果沒有這種類型轉換,Visual Studio是不知道.X 就是一個屬性。 就其本身而言,我覺得這很令人費解,所以我用一些重型鑄件解決了這個問題。
即使使用此類型轉換,它也不會編譯,因為Visual Studio會拋出錯誤,因為我沒有顯式創建每個方法: 'ExportHOE.SketchPointWriter'沒有實現接口成員'SldWorks.ISketchPoint.Type'
這在我的腦海中創造了一個難題。 如果我需要重寫所有方法,那么繼承的重點是什么? API不是源代碼,它是DLL(?)所以我無權訪問源代碼。
所以,問題是:
如您引用的Solidworks文檔中所述,SolidWorks提供了基於COM的API。 COM(組件對象模型)是圍繞接口繼承構建的,並且不為您正在尋找的實現繼承提供內在支持。 事實上,COM 設計可以防止您以任何方式訪問各種對象的內部,而不是通過聲明的接口。 (請參閱MSDN中的組件對象模型和COM對象和接口 ,以簡要概述COM是什么和不是什么。)
所以,是的,他們的API是以不支持繼承其對象實現的方式實現的。 OTOH,聽起來你的目標是使用C#為Solidworks提供的對象編寫附加功能,同時僅依賴於他們的公共接口。 為此,您最好的選擇是創建擴展方法 ,類似於:
public static class SolidWorksExtensions
{
public static void writeXml(this SketchPoint point,
XmlWriter writer, string nameElement)
{
writer.WriteStartElement(nameElement);
writer.WriteString(Convert.ToString(point.X * 1000.0) + ", ");
writer.WriteString(Convert.ToString(point.Y * 1000.0) + ", ");
writer.WriteString(Convert.ToString(point.Z * 1000.0));
writer.WriteEndElement();
}
}
您可以使用裝飾器模式:
public class SketchPointWriter
{
private SketchPoint _sketchPoint;
public SketchPointWriter(SketchPoint sketchPoint)
{
_sketchPoint = sketchPoint;
}
public void writeXml(XmlWriter writer, string nameElement)
{
writer.WriteStartElement(nameElement);
writer.WriteString(Convert.ToString(_sketchPoint.X * 1000.0) + ", ");
writer.WriteString(Convert.ToString(_sketchPoint.Y * 1000.0) + ", ");
writer.WriteString(Convert.ToString(_sketchPoint.Z * 1000.0));
writer.WriteEndElement();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.