c# - 在 python 中使用引用作为函数调用 C# public voids
问题描述
我希望能够从 python 中的 C# 代码访问公共空白。c# 代码是在 Visual Studio 中制作的,需要以特定 .dll 文件的形式引用。
我尝试了 Ironpython、pynet,但似乎无法让它工作。
以下是 C# 中的代码,其中 Dlubal.RFEM5 是来自 .dll 文件的部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Dlubal.RFEM5;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
}
public void CreateNewApplication()
{
// creates a hidden RFEM instance and gets it's interface
IApplication app = new Dlubal.RFEM5.Application();
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//...
// here you can write your code
//...
// shows RFEM window
app.Show();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects.
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void GetActiveApplication()
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//...
// here you can write your code
//...
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateNewStructure()
{
// creates a hidden RFEM instance and gets it's interface
IModel model = new Model();
// checks RF-COM license and locks the application for using by COM
model.GetApplication().LockLicense();
//...
// here you can write your code
//...
// shows RFEM window
model.GetApplication().Show();
// unlocks the application and releases RF-COM license
model.GetApplication().UnlockLicense();
// releases COM object
model = null;
// cleans Garbage Collector for releasing all COM interfaces and objects.
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CloseApplication()
{
// Gets interface to a running RFEM.
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// Checks RF-COM license and locks the application for using by COM.
app.LockLicense();
//...
// Here you can write your code.
//...
// Unlocks the application and releases RF-COM license.
app.UnlockLicense();
// Closes the application.
app.Close();
// Cleans garbage collector and release application from the memory.
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CleanModelData()
{
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
model.GetApplication().LockLicense();
IModelData data = model.GetModelData();
data.PrepareModification();
data.Clean();
data.FinishModification();
model.GetApplication().UnlockLicense();
}
public void AddPoint(float xval, float yval, float zval, int number)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a point id 3D space
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Node newnode = new Node();
#pragma warning restore IDE0017 // Simplify object initialization
newnode.X = xval;
newnode.Y = yval;
newnode.Z = zval;
newnode.No = number;
data.PrepareModification();
data.SetNode(newnode);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void Addline(int numbernode1, int numbernode2)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a line in 3D space between 2 nodes
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Line newline = new Line();
#pragma warning restore IDE0017 // Simplify object initialization
newline.NodeList = string.Format("{0},{1}",numbernode1,numbernode2);
newline.Type = LineType.PolylineType;
data.PrepareModification();
data.SetLine(newline);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void AddMaterial(string description, int number)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new material
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Material newmat = new Material();
#pragma warning restore IDE0017 // Simplify object initialization
newmat.Description = description;
newmat.No = number;
data.PrepareModification();
data.SetMaterial(newmat);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreatNewMember(int linenumber, int startcrossectionnumber, int number)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a member (beam with crossection) in 3D space at a line
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Member newmember = new Member();
#pragma warning restore IDE0017 // Simplify object initialization
newmember.LineNo = linenumber;
newmember.StartCrossSectionNo = startcrossectionnumber;
newmember.No = number;
data.PrepareModification();
data.SetMember(newmember);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateNewCrosssection(string textid, int materialnumber, int number)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new crossection
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
CrossSection newcross = new CrossSection();
#pragma warning restore IDE0017 // Simplify object initialization
newcross.TextID = textid;
newcross.MaterialNo = materialnumber;
newcross.No = number;
data.PrepareModification();
data.SetCrossSection(newcross);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateNewNodalSupport(int number, string nodelist, int restrainx, int restrainy, int restrainz, int restrainrotationx, int restrainrotationy, int restrainrotationz)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new nodalsupport
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
NodalSupport nodalSupport = new NodalSupport();
#pragma warning restore IDE0017 // Simplify object initialization
nodalSupport.No = number;
nodalSupport.NodeList = nodelist;
nodalSupport.RestraintConstantX = restrainrotationx;
nodalSupport.RestraintConstantY = restrainrotationy;
nodalSupport.RestraintConstantZ = restrainrotationz;
nodalSupport.SupportConstantX = restrainx;
nodalSupport.SupportConstantY = restrainy;
nodalSupport.SupportConstantZ = restrainz;
data.PrepareModification();
data.SetNodalSupport(nodalSupport);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateNewLoadCase(int number, bool SelfWeight, bool ToSolve, ActionCategoryType ActionCathogory, float SelfWeightFactorX, float SelfWeightFactorY, float SelfWeightFactorZ)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new loadcase
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads data = model.GetLoads();
LoadCase loadCase = new LoadCase();
loadCase.Loading.No = number;
loadCase.SelfWeight = SelfWeight;
loadCase.ToSolve = ToSolve;
loadCase.ActionCategory = ActionCathogory;
if (SelfWeight)
{
loadCase.SelfWeightFactor.X = SelfWeightFactorX;
loadCase.SelfWeightFactor.Y = SelfWeightFactorY;
loadCase.SelfWeightFactor.Z = SelfWeightFactorZ;
}
data.PrepareModification();
data.SetLoadCase(loadCase);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateLoadCombo(int loadnumber, bool ToSolve, string definitionloadcombo)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new loadcombination
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads data = model.GetLoads();
Dlubal.RFEM5.LoadCombination loadCombination = new Dlubal.RFEM5.LoadCombination();
loadCombination.Loading.No = loadnumber;
loadCombination.ToSolve = ToSolve;
loadCombination.Definition = definitionloadcombo;
data.PrepareModification();
data.SetLoadCombination(loadCombination);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void CreateResultCombo(int resultnumber, string resultdefinition)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new resultcombination
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads data = model.GetLoads();
Dlubal.RFEM5.ResultCombination resultCombination = new Dlubal.RFEM5.ResultCombination();
resultCombination.Loading.No = resultnumber;
resultCombination.Definition = resultdefinition;
data.PrepareModification();
data.SetResultCombination(resultCombination);
data.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void Trapezoidalload(int loadnumber, string objectlist, float magnitude1, float magnitude2, bool relativedistance, float distanceA, float distanceB)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new trapezoidal load
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads loads = model.GetLoads();
#pragma warning disable IDE0017 // Simplify object initialization
MemberLoad memberLoad = new MemberLoad();
#pragma warning restore IDE0017 // Simplify object initialization
memberLoad.No = loadnumber;
memberLoad.ObjectList = objectlist;
memberLoad.Distribution = LoadDistributionType.TrapezoidalType;
memberLoad.Magnitude1 = magnitude1;
memberLoad.Magnitude2 = magnitude2;
memberLoad.RelativeDistances = relativedistance;
memberLoad.DistanceA = distanceA;
memberLoad.DistanceB = distanceB;
// gets load case No.1
ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
// sets member load
loadCase.PrepareModification();
loadCase.SetMemberLoad(memberLoad);
loadCase.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void Uniformload(int loadnumber, string objectlist, float magnitude1)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new uniform load
//ILoadCase loadCase = Marshal.GetActiveObject("RFEM5.Memberload") as ILoadCase;
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads loads = model.GetLoads();
#pragma warning disable IDE0017 // Simplify object initialization
MemberLoad memberLoad = new MemberLoad();
#pragma warning restore IDE0017 // Simplify object initialization
memberLoad.No = loadnumber;
memberLoad.ObjectList = objectlist;
memberLoad.Distribution = LoadDistributionType.UniformType;
memberLoad.Magnitude1 = magnitude1;
// gets load case No.1
ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
loadCase.PrepareModification();
loadCase.SetMemberLoad(memberLoad);
loadCase.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void Nodalload(int loadnumber, string nodelist, float Fx, float Fy, float Fz, float Mx, float My, float Mz)
{
// gets interface to a running RFEM
IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
// checks RF-COM license and locks the application for using by COM
app.LockLicense();
//adding a new nodal load
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
ILoads loads = model.GetLoads();
#pragma warning disable IDE0017 // Simplify object initialization
NodalLoad nodalLoad = new NodalLoad();
#pragma warning restore IDE0017 // Simplify object initialization
nodalLoad.No = loadnumber;
nodalLoad.NodeList = nodelist;
nodalLoad.Component.Force.X = Fx;
nodalLoad.Component.Force.Y = Fy;
nodalLoad.Component.Force.Z = Fz;
nodalLoad.Component.Moment.X = Mx;
nodalLoad.Component.Moment.Y = My;
nodalLoad.Component.Moment.Z = Mz;
ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
loadCase.PrepareModification();
loadCase.SetNodalLoad(nodalLoad);
loadCase.FinishModification();
// unlocks the application and releases RF-COM license
app.UnlockLicense();
// releases COM object
app = null;
// cleans Garbage Collector for releasing all COM interfaces and objects
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
public void SetSurface(int surfacenumber, int materialnumber, string boundarylines, float thicknessconstant)
{
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
model.GetApplication().LockLicense();
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Surface surface = new Surface();
#pragma warning restore IDE0017 // Simplify object initialization
surface.No = surfacenumber;
surface.MaterialNo = materialnumber;
surface.BoundaryLineList = boundarylines;
surface.Thickness.Constant = thicknessconstant;
data.PrepareModification();
data.SetSurface(surface);
data.FinishModification();
model.GetApplication().UnlockLicense();
}
public void SetSolid(int surfacenumber, int materialnumber, string surfaceslist)
{
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
model.GetApplication().LockLicense();
IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
Solid solid = new Solid();
#pragma warning restore IDE0017 // Simplify object initialization
solid.No = surfacenumber;
solid.MaterialNo = materialnumber;
solid.SurfaceList = surfaceslist;
data.PrepareModification();
data.SetSolid(solid);
data.FinishModification();
model.GetApplication().UnlockLicense();
}
public void SetSurfaceUniformLoad(int surfaceloadnumber, string surfaceslist, LoadDirectionType loaddirection, int strength)
{
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
model.GetApplication().LockLicense();
ILoads loads = model.GetLoads();
#pragma warning disable IDE0017 // Simplify object initialization
SurfaceLoad load = new SurfaceLoad();
#pragma warning restore IDE0017 // Simplify object initialization
load.No = surfaceloadnumber;
load.SurfaceList = surfaceslist;
load.Direction = loaddirection;
load.Distribution = LoadDistributionType.UniformType;
load.Type = LoadType.ForceType;
load.Magnitude1 = strength;
// gets load case No.1
ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
// sets surface load
loadCase.PrepareModification();
loadCase.SetSurfaceLoad(load);
loadCase.FinishModification();
model.GetApplication().UnlockLicense();
}
public void Calculateresults()
{
IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
model.GetApplication().LockLicense();
ICalculation calculation = model.GetCalculation();
// Calculates everything
calculation.CalculateAll();
model.GetApplication().UnlockLicense();
}
}
}
解决方案
推荐阅读
- ios - 如何在 WidgetKit 中显示来自 HealthKit 和互联网的数据
- reactjs - 可以有一个 HOC 只用于在 React 的 CSS 类中包装孩子吗?
- wildcard - 从 (GNU)tar 存档中提取子文件夹
- flutter - 更新旧应用程序导致此错误 => 无法确定任务 ':app:compileDebugJavaWithJavac' 的依赖关系
- bootstrap-modal - Bootstrap 5使用java脚本隐藏模式
- c# - 我可以重载 = 赋值运算符吗?
- python - 从列表中获取每个值并在数据框中迭代以总结具有多个条件的列中的数值
- observable - MobX observable 未被跟踪
- webpack - Angular 9 如何将单个 Vendorchunk 文件拆分为多个块文件
- xamarin.forms - Xamarin.Forms 从服务更新标签文本