热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NX二次开发C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数

在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了。头疼的要死。也吃不下去饭。早就想些这篇文章了,但是最近临近中秋十一,晚上太忙了。版本:NX11+VS2013最近这一年

在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了。头疼的要死。也吃不下去饭。

早就想些这篇文章了,但是最近临近中秋十一,晚上太忙了。

版本:NX11+VS2013

最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发。

C#在做复杂界面开发的时候,WinFrom要比MFC简单的多(这个时候纯BlockUI已经满足不了集成功能的复杂界面需求了),数据库连接也简单。

言归正传

在我经过一段时间的看QQ群别人讨论技术,给了我点启发,以及带着兴趣百度到了一些相关资料。学会了这种方法。

1.有需求

在用C#做NX二次开发的时候,我们一般需要引用NX官方封装好的的这几个dll。

技术分享图片

 用C#的,一般都是用NXOpen的比较多,用UF的比较少,因为UF官方封装的不全,有很多没有封装。也因为C#用NXOpen语言上特别简单,好用。

不需要delete,不需要迭代器,快速转换成字符串等等。

那么在项目开发中,如果遇到loop这种官方没有封装的函数怎么办?


UF_MODL_ask_face_loops
UF_MODL_ask_loop_list_count
UF_MODL_ask_loop_list_item
UF_MODL_delete_loop_list

没关系,官方没有封装的UF函数,我们可以直接去这5个dll里调用。用DllImport去调用(是什么,怎么用请自行百度)。


libufun.dll
libnxopencpp.dll
libugopenint.dll
libnxopenuicpp.dll
libopenpp.dll

比如,我们现在想要调用UF_OBJ_set_color这个函数(这个函数官方已经封装了,这里只讲调用是怎么用的),给一个块设置颜色。

2.反编译C.dll

首先,找到这个函数,在上面5个中的哪个dll里。

这时就需要使用VC程序的反编译工具Depends.exe这个工具了,按个打开dll,去里面找到看有没有这个函数。

功能介绍:

查看 PE 模块的导入模块
查看 PE 模块的导入和导出函数
动态剖析 PE 模块的模块依赖性
解析 C++ 函数名称

等等

这里我先打开libufun.dll这个函数

技术分享图片

 错误不用管,点确定关掉

技术分享图片

 然后在这里找看有没有UF_OBJ_set_color

技术分享图片

 已经找到了,我们知道了可以去这个dll里调UF函数。

下一步我们要开始去C#里调用,但是怎么调用?不知道?对吧?

3.反编译.net.dll

这个时候又需要另外一个反编译dll工具了,dnSpy。

dnSpy中文版是一款net程序反编译工具,可以对net程序进行反编译,还有替代库文档的功能,如果遇到了代码丢失或者损坏的情况,可以直接恢复。

我们打开后是这个样子

技术分享图片

 下面我们打开官方封装的C# NXOpen.UF这个dll,去反编译下,看看里面都写了什么。(dnSpy是可以反编译别人写的普通的C#exe和dll的,桌面应用程序和NX二次开发的C#程序都可以反编译出来源代码,只要不加壳,加壳能反编译出部分代码)

打开后如下

技术分享图片

我们先去找到封装的UF_OBJ_set_color这个函数

技术分享图片

 这个时候我们就找到了,官方是怎么调用,怎么封装的NXOpen.UF.dll的了,是有出处的。

技术分享图片

4.我们如何调用

 我们把这句抄下来,去我们的NX C#项目中使用。


[DllImport("libufun.dll", CallingCOnvention= CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "UF_OBJ_set_color")]
internal static extern int _SetColor(Tag object_id, int color);

先加命名空间


using System;
using NXOpen;
using NXOpen.UF;
using System.Collections.Generic;//C# List<>的命名空间
using System.Runtime.InteropServices;//DllImport的命名空间

在添加一个类,写代码

技术分享图片

 然后在项目的Main入口函数里写代码。创建块-特征找体-设置颜色(用我们调用的函数)


//创建块
FeatureSigns sign = FeatureSigns.Nullsign;//定义布尔
double[] cornet_pt = { 100.0, 0.0, 0.0 };//定义原点
string[] edge_len = { "100.0", "100.0", "100.0" };//定义长宽高
Tag blk_obj_id = Tag.Null;
theUfSession.Modl.CreateBlock1(sign, cornet_pt, edge_len,
out blk_obj_id);
//特征找体
Tag BodyTag = Tag.Null;
theUfSession.Modl.AskFeatBody(blk_obj_id,
out BodyTag);
NXOpen.Utilities.JAM.StartUFCall();
//设置颜色(调用UF函数)
OpenAPI._SetColor(BodyTag, 186);
NXOpen.Utilities.JAM.EndUFCall();
Caesar卢尚宇
2020年9月29日

在我们反编译的代码中可以看到,在调用UF函数的时候,一定要用

NXOpen.Utilities.JAM.StartUFCall();和NXOpen.Utilities.JAM.EndUFCall();

这两个方法来开始和结束,中间调用。执行才有效,要不然执行不起作用。有点类似UF的

UF_initialize和UF_terminate

下面来执行下,我们上面的代码。看看效果。答案是可以调用的。也是这种方法调用的。

技术分享图片

5.如何调用loop等函数

好,现在我们已经知道怎么调用函数了,现在我们去调用loop那些函数。可以借鉴下已经封装的UF_MODL_ask_list_item是怎么定义输入输出的。


NX11+VS2013
using System;
using NXOpen;
using NXOpen.UF;
using System.Collections.Generic;//C# List<>的命名空间
using System.Runtime.InteropServices;//DllImport的命名空间
public class OpenAPI
{
[DllImport(
"libufun.dll", CallingCOnvention= CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "UF_OBJ_set_color")]
internal static extern int _SetColor(Tag object_id, int color);
[DllImport(
"libugopenint.dll")]
public static extern void uc1601(string msg, int mode);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_ask_face_loops")]
public static extern void AskFaceLoops(Tag faceld, out IntPtr loopList);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_ask_loop_list_count")]
public static extern void AskLoopListCount(IntPtr loop, out int count);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_ask_loop_list_item")]
public static extern void AskLoopListItem(IntPtr loopList, int index, out int type, out IntPtr list);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_delete_loop_list")]
public static extern void DeleteLoopList(out IntPtr loopList);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_ask_list_count")]
public static extern void AskListCount(IntPtr list, out int count);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_ask_list_item")]
public static extern void AskListItem(IntPtr list, int index, out Tag obj);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_delete_list")]
public static extern void DeleteList(out IntPtr list);
[DllImport(
"libufun.dll", EntryPoint = "UF_MODL_create_exp")]
public static extern void CreateExp(string expr_str);
}
public class Program
{
// class members
private static Session theSession;
private static UI theUI;
private static UFSession theUfSession;
public static Program theProgram;
public static bool isDisposeCalled;
//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
public Program()
{
try
{
theSession
= Session.GetSession();
theUI
= UI.GetUI();
theUfSession
= UFSession.GetUFSession();
isDisposeCalled
= false;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
// UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Error, ex.Message);
}
}
///


/// 获取面的loop
///

/// 输入面的tag
/// 输出lopps链表
public static void MyAskFaceLoops(Tag face, out List> loops)
{
NXOpen.Utilities.JAM.StartUFCall();
loops
= new List>();
IntPtr loopList
= IntPtr.Zero;
OpenAPI.AskFaceLoops(face,
out loopList);
int loopCount = 0;
OpenAPI.AskLoopListCount(loopList,
out loopCount);
var listPtrList = new List();
for (int i = 0; i )
{
var tagList = new List();
int type = 0;
IntPtr list
= IntPtr.Zero;
OpenAPI.AskLoopListItem(loopList, i,
out type, out list);
listPtrList.Add(list);
int listCount = 0;
OpenAPI.AskListCount(list,
out listCount);
for (int j = 0; j )
{
Tag obj = Tag.Null;
OpenAPI.AskListItem(list, j,
out obj);
tagList.Add(obj);
}
loops.Add(tagList);
OpenAPI.DeleteList(
out list);
}
OpenAPI.DeleteLoopList(
out loopList);
NXOpen.Utilities.JAM.EndUFCall();
}
//------------------------------------------------------------------------------
// Explicit Activation
// This entry point is used to activate the application explicitly
//------------------------------------------------------------------------------
public static int Main(string[] args)
{
int retValue = 0;
try
{
theProgram
= new Program();
//TODO: Add your application code here

Tag aa
= (Tag)47147;//通过移刀工具得到面的tag
theUfSession.Obj.SetColor(aa, 1);
//获得面的所有loop
List> loops = new List>();
MyAskFaceLoops(aa,
out loops);
//高亮面的所有loop
for (int i = 0; i )
{
for (int j = 0; j )
{
theUfSession.Ui.DisplayMessage("1", 1);
theUfSession.Disp.SetHighlight(loops[i][j],
1);
}
}
theProgram.Dispose();
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----

}
return retValue;
}
//------------------------------------------------------------------------------
// Following method disposes all the class members
//------------------------------------------------------------------------------
public void Dispose()
{
try
{
if (isDisposeCalled == false)
{
//TODO: Add your application code here
}
isDisposeCalled
= true;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----

}
}
public static int GetUnloadOption(string arg)
{
//Unloads the image explicitly, via an unload dialog
//return System.Convert.ToInt32(Session.LibraryUnloadOption.Explicitly);
//Unloads the image immediately after execution within NX
return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
//Unloads the image when the NX session terminates
// return System.Convert.ToInt32(Session.LibraryUnloadOption.AtTermination);
}
}
Caesar卢尚宇
2020年9月29日

技术分享图片

6.反编译别人的NX二次开发.net.dll源代码

这里博主我不提倡随便就去反编译别人的源代码,要尊重作者的开发成果。

至于什么时候,反编译,自行斟酌吧,哈哈~~。

在不加壳,加密的时候,.net很容易被反编译,加壳也能去破解的,毕竟是托管语言,只要在中间就能反编译,不像C++那种直接到内存中。

例子:就用我上面写的loop例子,用DnSpy反编译源代码

技术分享图片

 技术分享图片

 

 

Caesar卢尚宇

2020年9月29日

 


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
开口就笑i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有