如何从.net调用Active Reports 2.0 com组件?

时间:2016-05-29 13:07:41

标签: .net com com-interop

我使用regsvr32注册了Active Reports dll,arpro2.dll 为Active Reports生成互操作程序集会导致servar错误: Main.cs

using System.Diagnostics;
using DDActiveReports2;

namespace TestActiveReports
{
    internal class Program
    {
        private static void Main()
        {
            var r = new ActiveReportClass();
            r.LoadLayout(@"C:\temp\RPTCUM20F.rpx");
            var s = r.Sections;
            Debug.Assert(s.Count() > 0);
        }
    }
}

的.csproj:

<COMReference Include="DDActiveReports2">
  <Guid>{A7973091-BC64-4F16-84D4-A4BE059B4927}</Guid>
  <VersionMajor>2</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>

项目设置为x86,所以我认为位数没问题。

TestActiveReports.exe中发生未处理的“System.Runtime.InteropServices.COMException”类型异常

其他信息:服务器引发了异常。 (来自HRESULT的异常:0x80010105(RPC_E_SERVERFAULT))

DebugDiag显示抛出了Win32访问冲突异常

但是,在vb6中编写此存根包装器,将其编译为COM组件,然后在.NET中引用此COM组件:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "VbActiveReport"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Private ar As activeReport

Option Explicit


'CONSTRUCTOR

Private Sub Class_Initialize()
Set ar = New activeReport
End Sub


'DECONSTRUCTOR

Private Sub Class_Terminate()
Set ar = Nothing
End Sub


'PROPERTIES

Public Property Get Sections() As Sections
    Set Sections = ar.Sections
End Property


'METHODS

Public Sub LoadLayout(path As String)
ar.LoadLayout path
End Sub

为所有函数和类型编写VB6包装器都感觉很脏。此外,经过半天的家庭酿造发电机摆弄后,听起来并不像我原先想象的那么简单。

为什么.NET =&gt;从VB6编译的COM =&gt;活动报告有效,而.NET =&gt;活动报告失败?

编辑: 这是事件日志条目

Faulting application name: TestActiveReports.vshost.exe, version:12.0.30723.0, time stamp: 0x53cf4fe6
Faulting module name: arpro2.dll, version: 2.5.0.1322, time stamp: 0x4d252d15
Exception code: 0xc0000005
Fault offset: 0x0002b2a0
Faulting process id: 0x2368
Faulting application start time: 0x01d1b9b4eadc0f51
Faulting application path: C:\Users\myuser\Documents\Visual Studio 2013\Projects\TestActiveReports\TestActiveReports\bin\Debug\TestActiveReports.vshost.exe
Faulting module path: C:\temp\Active reports\arpro2.dll
Report Id: 2980b2a1-25a8-11e6-82c6-c4d987b41689

这里没有更多信息:(

1 个答案:

答案 0 :(得分:0)

结果是报告文件.rpx,包含嵌入的VB6代码。我怀疑这就是为什么通过VB包装器有所作为的原因。 LoadLayout必须eval使用rpx中的VB6代码,因此它需要VB运行库和/或库。

事实证明,甚至不需要用于转发函数调用的VB包装器。用于ActiveReport对象的VB工厂就足够了。

Function CreateReport () As ActiveReport
    Set CreateReport = new ActiveReport
End Function

在单个模块中拥有一个具有单个功能的中间工厂com组件,现在已经足够好了 - 只需要很少的工作,不需要维护。

一种可能更简洁的方法就是加载VB运行时&amp;库作为引用并将它们公开给通过新建Interop类型创建的ActiveReports对象。麻烦的是,我没弄明白该怎么做。