2

我正在努力使用我尝试在 ms axapta 2009 中使用的 .net activeX。

在我编译它的本地机器上使用这个组件,它工作得很好。它可以作为activeX元素添加到表单上,方法和事件列在axapta-activeX-explorer中,我可以毫无问题地与之交互。

但尝试将 dll 分发给其他客户端并没有按预期工作。通过 regasm /codebase /tlb 注册 dll 工作正常 - 收到消息,注册成功。在选择要添加到 ax 中的 activeX 元素时,也会列出该组件,但既没有列出函数也没有列出属性。并启动表单会导致错误消息 - activeX component CLSID ... not found on system, not installed。classID 确实是.net 中定义的那个。

奇怪的事情发生了,看看任务管理器。activeX 组件本身只是与 com 应用程序交互的包装器。当启动不工作和_not_installed_的ax-form时!activeX-thing,taskmanager 显示 com-application 的新进程,由 activeX 实例化:/

我尝试过的事情:

  • 使用不同版本的 regasm,例如 \Windows\Microsoft.NET\Framework\v2.0.50727 ;C:\Windows\Microsoft.NET\Framework64\v2.0.50727
  • 在 .net 中使用新的 GUID,然后从注册表中删除旧的 GUID
  • 编译,使用不同版本的 .net 框架
  • 通过 regasm、regasm /codebase、regasm /codebase /tlb 进行注册,使用 visual-studio-setup
  • 以管理员身份通过命令行运行注册
  • 以管理员身份运行安装程序
  • 在客户端机器上以管理员身份运行 ax
  • 将 dll 移动到不同的文件夹,然后进行新注册( windows/system32; ax/client/bin )
  • 安装到 GAC ( gacutil /i )
  • Visual Studio 中的不同项目选项(COM-Visibility;注册 COM-Interop;不同的 targetPlatform)

希望事实是,在启用 COM-Interop 注册选项的 Visual Studio 中编译所做的不仅仅是 regasm-registration,我使用 registry-monitor-microsoft-tool 来记录编译期间发生的注册表活动。

此外,使用这些日志在目标客户端上创建所有注册表项也不起作用。

任何提示或帮助将不胜感激!这件事已经阻止了我好几天:(

4

3 回答 3

2

有关 COM 集成的概述,请参见此处:

http://msdn.microsoft.com/en-us/library/aa591337.aspx

有关 .Net 集成的概述,请参见此处:

http://msdn.microsoft.com/en-us/library/aa659581.aspx

于 2010-06-08T07:55:02.843 回答
1

问题解决了。一切都是正确的 - 唯一误导的事情是错误消息启动一个添加了 activeX 组件的表单,告诉“系统上找不到组件......”

在 activeX 代码中这是一个完全不同的错误:解析带有特殊字符的 xml 文档并且没有在 xml 文件中定义正确的 iso 编码会引发未捕获的错误。this(!!) 导致了所有进一步的问题和最初帖子中提到的崩溃错误:/

无论如何感谢您的帮助。

于 2010-07-01T08:41:22.227 回答
1

我想与之交互的“目标”应用程序是具有 COM 功能的独立 exe。据我所知,AX 2009 不(或不会)支持 COM - 因此应该使用 .net。如果我正确理解您的答案,那只是另一轮!dll 只是作为一个包装器来访问上面提到的应用程序。regsvr32 不适用于 dll,因为 regasm 必须用于注册。我还在 AOT 中添加了一个参考 - 没有变化。奇怪的是 - 它已经工作了,并且仍在我的本地开发系统上工作。但不是在其他系统上。

于 2010-06-01T13:29:57.547 回答