私は、使用しているコア C# アプリケーションの依存関係である Microsoft Visual C++ COM プロジェクトを継承しました。プロジェクトを再コンパイルし、(tlbimp を使用して) 相互運用 DLL を再生成すると、OLE_HANDLE を受け取るライブラリ内のいくつかのメソッドが、以前のバージョンの相互運用 DLL から署名を変更します。
以前の相互運用性が生成されたとき、私は周りにいませんでしたが、Windows Server 2003 / Windows XP 上の VS2005 でコンパイルされたことはほぼ確実です。私のワークステーションは現在、Visual Studio 2010 (x64 用の C++ Visual Studio Compiler バージョン 16.00.40219.01) を使用する Windows 7 です。
これは、元の DLL と新しい DLL (ILSpy を使用) 用に生成された C# インターフェイスです。
新しいインターフェイス(2 番目のパラメーターは、ComAliasName 属性を使用してマーシャリングされ、int として):
[TypeLibFunc(64)]
[MethodImpl(MethodImplOptions.InternalCall)]
public virtual extern void GetSequence([MarshalAs(UnmanagedType.Interface)] [In] INameValueArray nvArray, [ComAliasName("stdole.OLE_HANDLE")] [In] int nvSequence);
古いインターフェイス(2 番目のパラメーターは uint):
[TypeLibFunc(64)]
[MethodImpl(MethodImplOptions.InternalCall)]
public virtual extern void GetSequence([MarshalAs(UnmanagedType.Interface)] [In] INameValueArray nvArray, [In] uint nvSequence);
私が見る限り、入力 IDL ファイルは変更されておらず、OLE_HANDLE の定義に影響を与える #includes / 条件付きステートメントもないようです。
問題のメソッドが呼び出されるたびに、AccessViolationException がスローされます。
生成されたインターフェイスが変更された理由 (MIDL/TLBIMP の変更によってこの動作が発生するかどうかわからない) や、これをさらにデバッグする方法を知っている人はいますか?
ヘッダ:
virtual HRESULT STDMETHODCALLTYPE GetSequence(INameValueArray *nvArray, OLE_HANDLE *nvSequence);
メソッドの C++ ソース:
HRESULT MyNamespace::GetSequence(INameValueArray *nvArray, OLE_HANDLE *nvSequence)
{
if(!nvArray || !nvSequence)
return E_POINTER;
(*nvSequence) = (OLE_HANDLE) (((CNameValueArray *)nvArray)->GetSeq());
return S_OK;
}