为啥在 Intel 机器上编译的 VB.NET DLL Addin for Inventor 可以在 Intel 机器上工作,但不能在 AMD 上工作?
Posted
技术标签:
【中文标题】为啥在 Intel 机器上编译的 VB.NET DLL Addin for Inventor 可以在 Intel 机器上工作,但不能在 AMD 上工作?【英文标题】:Why does A VB.NET DLL Addin for Inventor compiled on an Intel machine work on the Intel machine but not on AMD?为什么在 Intel 机器上编译的 VB.NET DLL Addin for Inventor 可以在 Intel 机器上工作,但不能在 AMD 上工作? 【发布时间】:2020-12-19 19:05:40 【问题描述】:我在 Visual Studio 2019 的 VB.Net 中不断开发发明者插件, 我有多台机器不同的版本,但偶尔有些机器不想加载插件 f.e。我现在拥有的当前版本适用于除一台 AMD 机器以外的所有机器。
当我使用相同的设置编译同一个项目时,在 AMD 机器上使用任何 CPU 构建选项完全没有任何变化,它运行没有问题。当我在我的主要开发机器上执行此操作时,它在另一台计算机上不起作用。
我用dependency walker检查了依赖关系,我没有收到任何错误消息。
当我在调试模式下创建断点并在“StandardAddInServer.vb”文件中调用的第一个方法中调试 dll 编译时,当它在 Intel 机器上编译时,它不会在 AMD 机器上到达它。但反过来它运行平稳。
我不知道这可能是什么,我只是推测这与机器的 AMD/Intel 差异有关。任何帮助将不胜感激。
Inventor 2018.3.7 Professional Build 287 位于 Intel i7-4771 机器 Visual Studio Community 2019 16.3.9、.NET 4.8.03761
Inventor 2018 Professional build 112 位于 AMD Ryzen 7 3700X 机器 Visual Studio Community 2019 16.7.2 .NET 4.8.03752
我们很乐意提供任何可能有用的信息。
【问题讨论】:
【参考方案1】:嗯....我坚持让机器在软件方面完全相同..我开始在 2018.3.1 版本中一一安装发明者更新,插件神奇地工作....所以我希望我能帮助别人,如果, 插件自动卸载没有任何错误,它可能是 Autodesk 发明者的错...
【讨论】:
【参考方案2】:您可以尝试使用以前的框架版本,例如 4.6.2。那应该可以解决问题。可能是 Inventor 的较新服务包可以处理使用较新 .net 版本创建的插件。 2018 Inventor 发布时,.net 4.8 不可用。
艾伯特写的也是真的。如果您的 dll 的体系结构不符合您的主机进程的体系结构,则无法加载它。 64 位进程只能使用 64 位 dll,而 32 位进程只能处理 32 位 dll。 Studio 不会将 .Net 项目编译成功能齐全的机器代码(现在您也可以这样做),而只是中间代码,最终由目标机器上的 .net 框架编译。如果选择了 anyCPU,则不必因为这种行为而为不同的硬件提供不同的版本。
【讨论】:
【参考方案3】:您是在使用任何 CPU,还是在强制项目使用给定的位大小?
如果您不设置它,并将其留在任何 CPU 上?好吧,如果您从 Visual Studio 启动应用程序(例如在该目标计算机上安装),那么该应用程序将以 x32 位运行。 但是,如果您从 Windows 命令行(命令提示符)启动程序。 好吧,如果您使用 x64 位命令提示符,您将获得一个 x64 位正在运行的进程内程序。如果您的任何外部 .dll 或库是 x32(或未使用任何 cpu 编译),或者您使用任何非管理代码库(例如 ghostscript 或类似的)?然后您的程序将以 x64 位运行(或尝试)。
但是,如果您启动 x32 位 Windows 命令提示符(其中有两个 - 一个是 x32,一个是 x64)。因此,如果您从 windows x32 位提示符启动 .net exe(您的程序),那么您的程序将以 x32 位在进程内运行。
所以,这里要小心。使用 Visual Studio 中的任何 CPU 总能获得 x32 位程序 - 包括调试。但是运行程序(在 VS 之外启动)并不总是 x32 位。
上述行为似乎可以解释您在 AMD 机器上遇到的问题/问题。不是您在该机器上安装了 VS,而是使用 VS 启动您的程序实际上强制它以 x32 位运行。
底线: 不要使用任何 CPU,除非这正是您需要的,并且您非常确定任何外部库也被编译为任何 CPU,或者事实上任何外部库都不使用任何非托管代码。
总之?我会将您的项目配置为强制以 x86 始终运行,因此您不会对代码无法正常工作感到惊讶。
我非常怀疑 AMD CPU 是否是问题所在,安装 VS 只是因为强制您的项目以 x32 而不是 x64 位运行。这里与 AMD 的关系为零。
【讨论】:
以上是关于为啥在 Intel 机器上编译的 VB.NET DLL Addin for Inventor 可以在 Intel 机器上工作,但不能在 AMD 上工作?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在我的 Mac 上编译的 C++ 库不能在服务器上运行?
Discord 在我的 GitHub 上编译的 dll 中找到了机器人令牌