7

アンマネージ Visual C++ ソリューションで C# COM プロジェクトからメソッドを呼び出そうとしていますが、次のエラーが発生し続けます

First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8).

次のコードで

SalesForceNew::IMyObjectClassPtr p;
p.CreateInstance(__uuidof(SalesForceNew::TestObject)); // error
SalesForceNew::MyObject mo = p->getObject(1, "a");

ただし、 の値moは期待どおりです (5、「aa」)。

次のコード行で tlb ファイルをインポートします。

#import "C:\Users\Bob\Desktop\ComTest\SalesForceNew\bin\x86\Debug\SalesForceNew.tlb" named_guids

C# プロジェクトは次のとおりです。

インターフェース:

using System.Runtime.InteropServices;

namespace SalesForceNew
{
    [ComVisible(true)]
    [Guid("22901ACD-CA30-4D3E-B84B-73B707026AE5")]
    public interface IMyObjectClass
    {
        MyObject getObject(int i, string s);
    }

    [ComVisible(true)]
    [StructLayout(LayoutKind.Sequential)]
    public struct MyObject
    {
        public int Getal;
        public string Text;
    }
}

インターフェースを実装するクラス:

using System.Runtime.InteropServices;

namespace SalesForceNew
{
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("234A2A35-F270-458D-A67B-C834EB794B27")]
    [ComVisible(true)]
    public class TestObject : IMyObjectClass
    {
        public MyObject getObject(int i, string s)
        {
            return new MyObject() { Getal = i * 5, Text = s + s };
        }
    }


}

C# COM プロジェクトのオプションRegister for COM interopとプロパティを確認しました。Make assembly COM-Visible


更新: C# COM プロジェクトのフレームワーク バージョンを 2.0、3.0、または 3.5 に変更すると、エラーは発生しません。フレームワークのバージョンが 4.0 または 4.5 の場合にのみ表示されます。

4

1 に答える 1

14

例外コードが 0x80000000 未満の例外は、致命的でない例外です。それらは情報を渡すために使用される傾向があります。靴はここに収まります。例外コード 0x04242420 は CLRDBG_NOTIFICATION_EXCEPTION_CODE にリバース エンジニアリングされています。ヒットを確認するには、Google クエリに番号を入力してください。 Microsoft の従業員からのこの回答は、おそらく最も信頼できるものです。

好奇心から少し調べてみたところ、これは実際には文書化されていない例外 (CLRDBG_NOTIFICATION_EXCEPTION_CODE) であり、明らかに 4.0 CLR のマネージ デバッガーによって使用される IPC プロトコルへの追加であることがわかりました。無視しても安全です。

于 2012-12-05T15:27:48.097 に答える