在不了解该领域的情况下对VB6代码进行逆向工程的最佳实践方法
目标状态:将VB6代码移植到C#中,通过所有可能涉及的过程进行整个项目. 如果您对域不了解,您的方法是什么? 几乎有任何文档,只有旧版代码(最多100.000-300.000行代码和注释VB6文件,其中包含高达14.000行代码)写在VB6中. 解决方案 免责声明:我为伟大的迁移工作 我们将大型VB6/ASP/COM应用程序重写为.NET(主要是C#)以谋生,我们已经开发了一种软件分析和重新设计工具来帮助我们做到这一点.该工具本质上像VB6/ASP/COM编译器和作者.NET代码的分解器.当然,由于VB6平台与.NET有很大不同,因此直接编译/反编译是不可取的或不可行的,因此我们的工具具有"分析仪",该工具实现了各种代码重新设计算法来处理VB6-C#Incompatibilitys.还有一个可编程的"作者",它允许迁移团队规定设置.NET代码文件,重组代码以及执行诸如使用.NET类替换COM API和ActiveX控件之类的事情 - 取决于团队所需的内容或想要.
0 2024-04-16
编程技术问答社区
在遗留的应用程序中,将静态类转换为普通类的简单方法,以实现嘲弄
传统应用程序中的静态类在单位测试中很难使用,因为您无法模拟它们. 在整个应用程序中将它们转换为使用Interafce的常规类的简单方法是什么? 解决方案 以两个步骤执行此操作是最简单且风险较小的. 第一步是重复的且不创意的,可以分配给初级工程师,甚至可以使用小程序来完成. 对于每个班级,请按照以下步骤: 从所需的方法和属性中删除静态关键字. 添加一个称为Instance的静态成员,其中包含类的实例.是的,我们正在制作 singleton . //Old class static class MyHelpers { public static string Foo(string x) { /* Implementation */ } } //New class class MyHelpers { public static MyHelpers Instance { get; } = new MyHelpers
0 2024-04-14
编程技术问答社区
如何检测非IEEE-754浮动,以及如何使用它们?
我正在为基本类型编写类,因此在多个平台和编译器上,代码在逻辑上相同(例如int_least16_t for int).为了娱乐! (我还是学生.) 我读了这篇文章: 还有什么更糟糕的: ∞,nan或-0 这意味着float 可能会 ... [edit:是的,这是不同的事情,但是没有:",但是必须suport否定数".是的,在standart中使用这样的事情,它可能不会untor norral 0 ...(我没有特定的fecyfication.)请参见] 我知道这就像 __int128 标准只是标准 但仍然... IEEE-754从1985年起,但有些机器可能很奇怪, 而且某些旧版硬件没有浮动单元. 我了解,浮点是强制性的(不是像INT16_T这样的可选), 但是可以按任何标准,并且任何值都可以吗? 我们唯一拥有的是一些宏( FLT_MIN,FLT_MAX - 即使FLT_MIN = IEEE-754::FLT_MIN,float也可以是非IEEE
0 2024-04-08
编程技术问答社区
我可以从传统的C语言回调中抛出C++异常吗?
我有使用某些C库的C ++代码. C库采用C语言回调.我在我的C ++代码中写了一个回调,现在我以某种方式需要从中报告错误(但它返回void).我想知道我是否可以从C ++代码中使用的C回调中抛出异常? 这对我来说很难理解. 谢谢,Boda Cydo. 解决方案 是的,您应该可以这样做.但是,请记住,C库完全不可能安全,因此您可能会将该图书馆的某些结构留在某些不一致的状态下.它完全取决于特定库和特定的回调功能.如果没有其他的话,该库可能必须从一开始就与C ++的支持书写. . 其他解决方案 是的,您可以从C ++功能中引发异常.但是,它只能被C ++代码捕获,因此不会在旧书库中处理.
0 2024-04-08
编程技术问答社区
将C源码转换为C++
您将如何转换一个相当大的(> 300k),相当成熟的C代码库转换为C ++? 使用内部链接使用Lieu私有功能和数据中的内部链接,以及用于公共功能和数据的外部链接,我想到的C的类型被分为大致对应模块的文件(即比典型的基于OO类的分解). .全局变量广泛用于模块之间的通信.有一个非常广泛的集成测试套件可用,但没有单位(即模块)级测试. 我有一个一般策略: 编译C ++的C子集中的所有内容并使其工作. 将模块转换为巨大的类,以便所有交叉引用都被类名称范围界定,但是将所有功能和数据留作静态成员,并使其正常工作. 将大型类别转换为具有适当构造函数和初始化的交叉引用的实例;用间接访问替换静态成员访问;并开始工作. 现在,将项目作为因素不良的应用程序,并在依赖性易于处理的情况下编写单元测试,并分解为单独的类别.这里的目标是在每个转换中从一个工作计划转移到另一个工作计划. 显然,这将是相当多的工作.关于这种翻译是否有案例研究/战争故事?替代策略?其他有用的建议? 注
0 2024-04-07
编程技术问答社区
你如何将单元测试引入一个大型的、传统的(C/C++)代码库?
我们有一个大型的多平台应用程序编写了C.多年来,它在大型C/C ++应用程序中所期望的许多功能已经发展出来: #ifdef地狱 很难隔离可测试代码的大文件 函数太复杂,无法容易测试 由于此代码针对嵌入式设备,因此在实际目标上运行它是很多开销.因此,我们想在本地系统上快速周期进行更多的开发和测试.但是,我们想避免经典的策略"复制/粘贴到系统上的.c文件,修复错误,复制/粘贴".如果开发人员要遇到麻烦,那么我们希望以后重新创建相同的测试,并以自动化的方式运行. 这是我们的问题:为了重构代码更模块化,我们需要更具测试.但是,为了引入自动单位测试,我们需要更模块化. 一个问题是,由于我们的文件如此之大,因此我们可能在文件中具有一个函数,该函数在同一文件中调用函数 我们需要暂停以进行良好的单位测试.由于我们的代码变得更加模块化,这似乎不是一个问题,但这还有很长的路要走. 我们想到的一件事是标记带有注释的"已知可以测试"源代码.然后,我们可以为可测试代码编写脚本扫描
0 2024-04-06
编程技术问答社区
为什么bmps是倒着存储的?
为什么BMP图像存储在倒置和零填充以使其四字节对齐? 解决方案 这是Petzold的报价: o,在dibs中,图像的底数是文件的第一行, 图像的第一行是文件中的最后一行.这是 称为自下而上的组织.因为这个组织是 违反直觉,您可能会问为什么这样做. 好吧,这一切都返回到OS/2演示经理.有人在 IBM决定PM中的所有坐标系统 - 包括 窗口,图形和位图 - 应该保持一致.这引起了 辩论:大多数人,包括与之合作的程序员 全屏文本编程或窗口环境,用术语思考 垂直坐标会增加屏幕上的增加.然而, 硬核计算机图形程序员从 源自分析几何学数学的观点. 这涉及矩形(或笛卡尔)坐标系 垂直坐标的增加在太空中会增加. 简而言之,数学家获胜.下午的一切都被一个 左下角,包括窗口坐标.这就是方式 是这样的. 来源:Charles Petzold,Windows 5th Edition的编程,第15章. 其他解决方案 它们被相应地存储到显示坐标系. (0,0)在左上角. X
0 2024-04-01
编程技术问答社区
bash: $[<算术表达式>] vs. $((<算术表达式>))
我只是偶然发现了bash语法: foo=42 bar=$[foo+1] # evaluates an arithmetic expression 当我为此谷歌搜索时,我发现 3.4.6.算术扩展 算术扩张允许评估算术表达和结果的取代.算术扩展的格式为: $(( EXPRESSION )) ... 在可能的情况下,Bash用户应该尝试使用Square Brackets的语法: $[ EXPRESSION ] 但是,这只会计算表达的结果,并且没有测试... 在我的Bash Man页面中,我只能找到$(( EXPRESSION ))表格,例如: foo=42 bar=$((foo+1)) # evaluates an arithmetic expression 那么,与$((...))有$[...]的$[...] $[...]只是$((...))的旧版本? 解决方案 bash v3.2.48的manpage说: [...
2 2024-03-27
编程技术问答社区
在遗留代码中使用RequireJS
我正在处理一个非常大的项目,该项目使用: 传统JSP页面,其中包括带有脚本标签的JavaScript文件 使用其他javaScript模块的骨干模型和视图,没有requirejs 我们现在想开始使用jquery,backbonejs和underscorejs来开始使用requienjs,从现在开始我们开发的所有内容,但是我们没有资源来重写所有传统JSP页面.我们可能有时间重写我们已经开发的骨干模型和视图. 问题在于,对于我们的旧代码(上面的1和2),我们将所有JavaScript文件都包含在一个巨大的文件中,然后将其运送到浏览器中.这个庞大的文件必须能够与我们的新requirejs模板共存,但是我该如何?将巨大文件的某些部分分开,因此我可以使用requirejs将它们与模板一起使用?不必重写所有使用该文件的部分或具有重复代码的页面. 谢谢! 解决方案 我不知道我是否完全掌握了问题,但是我认为aqueremjs的shim或map功能会帮助您. 从巨大
0 2024-03-26
编程技术问答社区
如何为一个进程外的COM服务器强制进行进程隔离?
我正在编写必须与供应商的COM Automation Server交互的托管代码,该供应商的COM Automation Server用完了.我发现,如果多个客户端连接到它,该服务器就会变得不稳定.例如,如果我在流程A中管理了代码和流程B中的托管代码,则两者都连接到此COM服务器,则将为COM服务器启用一个进程,并且其行为却不可靠. 我希望有一种方法可以强制每个客户端连接的单独过程.理想情况下,我想结束: 托管流程A与COM服务器交谈 c1 托管过程b与com服务器交谈 c2 一个想到的想法是,如果我运行A和具有不同安全身份的处理B,那可能会导致COM基础架构创建单独的服务器进程.但是,我宁愿不走那条路.托管流程A和托管过程B实际上是Windows服务.我正在使用Identity Local系统运行它们(因为我需要它们与桌面交互,并且您无法在服务小程序上查看"与局部运行的服务"上的"与桌面互动"框系统).我需要与桌面互动的原因是,该com服务器偶尔会在屏幕上投掷一个对话框,
2 2024-03-21
编程技术问答社区
列出所有可用的.NET程序集
列出所有可用的.NET 2.0组件的最佳方法是什么? 所需的列表的一个示例是MS Visual Studio在.NET选项卡中进行'添加引用... 时显示的一个MS Visual Studio显示 我已经阅读了Visual Studio使用其自己的目录配置,而GAC另一种和.NET构造.关于我如何以计算机便携式方式知道该目录在哪里的任何想法(例如,另一台计算机可能在d:drive中安装了窗口)? 从列出的信息中,必须可以汇编.loadxxx()it. 注意:应该以编程方式进行,而不是使用gacutil(除非提供C#API).所有这些的目的是创建一个自定义动态脚本编辑器,以便您了解需要获取此信息. 解决方案 首先,GAC中的参考组件和组件之间存在重要的区别.要编译代码,您需要一个参考组件.要运行代码,您需要与.exe同一文件夹中的汇编副本或GAC中的汇编. 通常,当您安装.NET应用程序时,其安装程序将复制其在GAC中使用的程序集.这些组件是不可用作参考
8 2024-03-16
编程技术问答社区
经典的ASP服务器端JSON库
我继承了一些经典的ASP代码,我需要一个可以实例化并运行服务器端的JSON库,以与JavaScript编码的服务器端ASP一起使用. 我该怎么做? 解决方案 用于写/输出JSON,我相信 在经典ASP中解析JSON的任何好的库?/a> 在该线程中,克里斯·尼尔森(Chris Nielsen)在服务器端使用JavaScript库有一个创意的想法(因为ASP支持JScript以及VBScript).我没有尝试过,但是也许可以解决解析和写作. 其他解决方案 根据我的经验, json2.js 要使用它,我在.asp代码中这样做: ... my code here.
2 2024-03-16
编程技术问答社区
是否可以在MVC和webforms之间共享一个主页面?
我将MVC添加到一个具有许多旧网络页面的项目中.这很好.但是,我目前有一个单独的MVC和WebForm的主页.这两个主页产生的输出基本相同.我真的很想杀死Webforms,只使用我所有页面的MVC主页并保持干燥. 当我忘了改变两者时,不干了我几次. 我尝试采用明显的方式,而只是将WebForm内容页面的主页属性指向MVC MasterPage.这引发了一个错误,说MVC Masters仅与MVC视图一起使用. 这似乎是混合MVC和WebForm项目的一个很常见的问题.我的MVC Master没有使用ViewData做任何事情,因此我看不出WebForm无法使用它们的任何原因. 解决方案 您绝对可以共享同一主页.您的MVC主页必须简单地通过其MasterPageFile属性指向WebForms MasterPage.这将您的WebForms主页样式应用于您的MVC主页. 我正在制作中使用此设置. 我的MVC主页上的声明,指向Web表单主页:
2 2024-03-12
编程技术问答社区
单元测试遗留的ASP.NET Webforms应用程序
我继承了一个没有单位测试的旧网络应用程序.我想添加一些,但我却丢了从哪里开始.我应该将它们添加到旧代码中吗?还是只有新的代码将继续?如果该代码与旧版代码相互作用怎么办?你会建议什么? 解决方案 首先,我建议单元测试未来的所有更改,我认为大多数人都同意这是回归的好主意. 但是,对于现有代码,这是您需要查看您愿意或允许将其引入产品的风险的情况之一.问题在于,当您开始单元测试现有代码库时,您很快就会意识到许多重构和设计改进的机会. 从我那里拿走它,如果您是一个良好设计的棍子,但是您没有有能力进行重构的重构降落,那么当您尝试编写测试的测试时,您只会最终陷入困境旧版零件 - 是的,如果没有现有的测试套件,则需要重构.如果您不允许对生产应用程序进行高影响更改,那么您将最终实施我们喜欢称为"垃圾适配器模式"的东西.祝你好运! 其他解决方案 我建议您获得工作有效地使用旧代码. 我们在一个研究小组中浏览了这本书.这很痛苦,但有用. 主题包括: 了解软件更改的机
0 2024-03-07
编程技术问答社区
如何恢复遗留系统的架构(PHP)
我正在尝试恢复旧系统的体系结构.这对我来说是新事物.到目前为止,我已经阅读了许多研究论文,其中大多数研究人员都为此提供了框架和自动化工具.但是我不知道如何从这些框架或工具中选择最佳.所有研究都有一些常见步骤,例如反向工程和前进工程. 有人可以帮忙吗? 开始传统系统的恢复体系结构的基础阶段是什么? 什么是基本步骤? 有指南吗? 谢谢 解决方案 转换旧系统时,您必须牢记团队的技术.您必须进行的更改将归功于应用程序的核心,如果开发团队不参加更改,将是一个长期的慢速迁移. 重新加工旧系统的关键是依赖注入和服务位置.第一步是安装依赖项注入容器,并在容器中添加类(记录器始终是一个很好的第一服务). 下一步是添加服务定位器.构造函数注入是Greenfield项目的最佳方法,但是对于Legacy应用程序,一开始是不可能的.使用服务定位器,您可以从任何地方访问注射容器,从而在需要时允许服务分辨率.使用此位,您可以用Logger Resolution Code扫描并替换Logger创建代
0 2024-03-03
编程技术问答社区
命名空间/解决方案结构
我为提出这样一个广泛的问题而表示歉意,但这对我来说可能具有挑战性.我的团队即将开始一个大型项目,希望多年来演变的所有随机的一次性代码库.鉴于该项目将涵盖整个公司的标准化逻辑实体("客户","员工"),小任务,控制小任务的大型任务以及公用事业服务,我正在努力找出结构的最佳方法名称空间和代码结构. 尽管我想我没有给您足够的细节,您是否有有关如何在逻辑上划分域的资源或建议?如果有帮助的话,大多数此功能将通过Web服务揭示,并且我们是Microsoft 使用所有最新的Gizmos和小工具购物. 我正在辩论一个大规模的解决方案,以使参考文献变得更容易,但是这会变得太笨拙吗? 我应该总结旧的应用程序功能,还是在名称空间中放置完全不可知论(例如,OurCRMProduct.Customer类而不是通用Customer类)? 每个服务/项目是否应该拥有自己的BAL和DAL,还是应该是所有内容所引用的完全独立的组件? 我没有组织此类深远的项目的经验,只有一次性,所以我正在寻找可以得到
4 2024-03-03
编程技术问答社区
滴滴出行,反腐层,如何?
目前,我们必须构建一个基于旧版的应用程序.该旧应用程序的代码应被扔掉和重写,但是通常会进行 - 我们不必重写它,而需要在其上基于新的内容.最近,我们决定走域Drivendesign路径.因此 - 反腐败层可能是解决我们问题的解决方案.据我了解,这种方式应该可以逐渐重写旧应用程序. 但是 - 我找不到任何很好的例子.我会喜欢任何信息. 解决方案 在我的特定实现中,implyeaccessservice由存储库调用.这确实是进入反腐败层的立面.它委派给了雇员.适配器从传统模型(从amplyeeaccessfacade获得)中获取一个对象,然后将其传递给lospereeaeaccesstranslator,以将对象从遗留模型转换为我应用程序模型中的域对象. public Employee findEmployee(String empID){ return adapter.findEmployee(empID); } public Employee findEm
0 2024-03-03
编程技术问答社区
在Angular应用程序中,Grunt在页面重载时重写URL
这是grunt文件中的livereload块: livereload: { options: { open: true, middleware: function(connect, options, middleware) { var optBase = typeof options.base === "string" ? [options.base] : options.base; return [ [ require("connect-modrewrite")(["!(\\..+)$ / [L]"]) ].concat( optBase.map(function(path) { return connect.static(path); }) ), connect.static(".tmp"),
0 2024-02-20
编程技术问答社区
为什么在Android Studio 3.1中,一些视图位于传统标签内,是什么取代了它们?
我已经将Android Studio更新为3.1稳定的频道.我注意到调色板窗口中的"所有"选项卡已被删除,并引入了"旧版"选项卡.该选项卡包含以下内容: ListView Tabhost relativelayout GridView 我没有提及GridLayout,因为它是可下载的依赖性,而不是来自Android API的视图. 哪些新视图替换了上述视图? 我知道ConstraintLayout替代RelativeLayout,但是是什么替换ListView,GridView或TabHost?我想成为最新的. 解决方案 ListView - 替换为RecyclerView TabHost - 替换为TabLayout RelativeLayout - 替换为ConstraintLayout GridView - 替换为ConstraintLayout 主要是由于新的性能更好. RecyclerView.Adapter已
0 2024-02-18
编程技术问答社区
Google Play服务API的旧版本的可靠来源
我正在研究一个使用Google Play Services'GCMNetworkManager的应用程序. this 不幸的是,我似乎无法在Android SDK Manager中选择旧版本.在Google搜索中有几个网站提供了较旧的API版本,但它们似乎都不是官方的Google页面,因此出于安全原因,我有点犹豫使用它们. 我也宁愿不使用此处类似问题的答案中建议的技巧( https://stackoverflow.com/A/32859695/1217178 ),因为我不知道API的一部分是否会欺骗到执行未经测试的APK的未测旧版本. . 解决方案 我想我应该搜索更长的时间...这是我正在寻找的答案: https://stackoverflow.com/a/26838281/1217178 更具体地: v7.5.71 API文件可在 上找到 zip 其他解决方案 这实际上是安全的吗? 好吧,这有点是进行工件版本.据推测,Google打算将这些
2 2024-02-12
编程技术问答社区