列文章目录
前言
随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。
然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。
一、知识点提取
本实例实现了通过VB调用VC++的dll的方法,主要知识点如下:
1、VC++程序申明可以被VB调用的外部方法
2、VB程序通过DllImport导入VC的非托管程序集,并指定需要调用的方法
3、VB程序调用C++方法
二、案例需求分析
1、调试截图
2、需求说明
这里来说说为什么要用.NET调用VC的非托管dll,原因有二:
1、我们在做ug/nx的二次开发的过程中,经常会遇到一些内部方法C++可以调用,但是.NET程序无法调用的情况,那是因为西门子的Open C函数C/C++可以直接调用,而.NET程序调用都是UF Wrapper封装的Open C, 而UF Wrapper在封装的时候,并没有完全封装。所以,我们需要通过调用VC的非托管dll,间接调用Open C函数。
2、出于知识产权的考虑,很多项目要求dll加密,但是C#是基于IL 中间语言和 .NET Framework CLR 运行的很容易被反编译,通过C#调用C++无托管dll,就能很好的从根本上解决问题
三、程序分析
1、源码所在目录
UGOPEN\SampleNXOpenApplications\.NET\InteropCallCFromDotNet
2、主要功能分析
1、VC++程序申明可以被VB调用的外部方法
extern "C" __declspec(dllexport) int UFappFunction1(void)
{
return( myFunction1() );
}
extern "C" __declspec(dllexport) int UFappFunction2(int value, char *string)
{
return ( myFunction2(value,string) );
}
2、 VB程序通过DllImport导入VC的非托管程序集,并指定需要调用的方法
<DllImport(UFAPP_DLLNAME, EntryPoint:="UFappFunction1", _
CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
Shared Function UFappFunction1() As Integer
End Function
<DllImport(UFAPP_DLLNAME, EntryPoint:="UFappFunction2", _
CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> _
Shared Function UFappFunction2(ByVal value As Integer, ByVal str As String) As Integer
End Function
3、 VB程序调用C++方法
Public Sub Main()
Try
Dim value As Integer = 88
Dim ret1 As Integer = 0
Dim ret2 As Integer = 0
theNXsession = Session.GetSession
theUFsession = UFSession.GetUFSession
theNXsession.LogFile.WriteLine("BEGIN VBapp (Running from File->Execute)")
' Call Functions in UFLegacyApp
ret1 = UFappFunction1()
ret2 = UFappFunction2(88, "This string is from VBapp")
theNXsession.LogFile.WriteLine("funtions1:" & ret1.ToString & " " & _
"function2:" & ret2.ToString)
theNXsession.LogFile.WriteLine("END VBapp")
Catch ex As Exception
UI.GetUI.NXMessageBox.Show("NXOpen automation example", NXMessageBox.DialogType.Error, ex.ToString)
End Try
End Sub