2016-05-29 36 views
0

私はservar障害でアクティブレポートの結果の相互運用機能アセンブリを生成します。regsvr32 を使用して、arpro2.dllをアクティブレポートのdllを登録: Main.cs.netからActive Reports 2.0 comコンポーネントを呼び出す方法は?

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に構築するように設定されているので、bitnessは問題ではないと思います。

型「System.Runtime.InteropServices.COMException」の未処理の例外はTestActiveReports.exe

で発生しました追加情報:サーバーが例外をスローしました。 (HRESULTからの例外:0x80010105(RPC_E_SERVERFAULT))DebugDiagは、Win32アクセス違反の例外がしかし、.NETでこのCOMコンポーネントを参照し、その後、COMコンポーネントにそれをコンパイルし、VB6でこのスタブラッパーを書い

を投げされて明らかに

作品:

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 => COMはVB6 =>アクティブなレポートからコンパイルされますが、.NET =>アクティブなレポートは失敗しますか?

編集: ここでこのイベントログエントリである

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 

あまり詳細:(

+0

RPC_E_SERVERFAULTを効率的にデバッグすることはできません。これは、COMサーバープロセスであり、何か厄介なものがありました。アクセス違反は、彼らが来るほど厄介で不釣り合いです。 Windowsアプリケーションログで何も通知されない場合は、ベンダーからこの問題のトラブルシューティングに役立つ必要があります。この問題を再現する小さなレプロプロジェクトを準備しておいてください。 –

答えて

0

は、レポートファイル、.rpxは、埋め込まれたVB6のコードが含まれてい判明私はこれがあると思います。 VBラッパーを使用する理由は違います。LoadLayoutはVBxコードをrpxで使用する必要があるため、VBランタイムおよびライブラリが必要です。evalない必要。 ActiveReportオブジェクトのVBファクトリで十分です。 、維持するための本当の必要性はほとんど仕事 - 単一のモジュール内の単一の機能を有する中間工場COMコンポーネントを持つ

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

は今のために十分にちょうど良いではありません。

VBのランタイム&のライブラリを参照としてロードし、Interopタイプを新しく作成して作成したActiveReportsオブジェクトにそれらを公開することもできます。問題は、私はそれを行う方法を理解していないということです。