C#で記述されたCOM DLLがあります。私はVBA(MS Access 2010)からDLLを使用しています。C#COM DLLを使用する場合のVBAの参照(出力)パラメータ
DLL内の一部の関数には、VBAから使用すると正しく動作しないout
のパラメータが含まれています。関数が呼び出されたときにVBAによって「オブジェクトのインスタンスに設定されていません」というエラーが発生します。 DLLクラスの他のすべての関数が正しく動作しています。
VBAコード:
Dim par0 As String
par0 = "test"
Dim outPar1 As Boolean
Dim outPar2 As myDllNamespace.Foo
Set outPar2 = New myDllNamespace.Foo
Dim outPar3 As String
dllClassInstance.Bar par0 outPar1 outPar2 outPar3
C#COM DLLコード(dLLClassInstanceのクラス):
[ProgId("myDllNamespace.DllTestClass")]
[Guid(...),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IDllTestClass))]
public class DllTestClass : IDllTestClass
{
public void Bar(string filter, out bool success, out Foo entries, out string html) { ... }
}
C#COM DLLインターフェースコード(クラスのインターフェース):
[Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IDllTestClass
{
void Bar(string filter, [Out] out bool success, [Out] out Foo entries, [Out] out string html);
}
すべての変数が値を持っていてもVBAが「オブジェクトのインスタンスに設定されていないオブジェクト参照」エラーをスローすると3つの最後のパラメータは、とにかく出力パラメータですか?
これは.NET例外、NullReferenceExceptionであり、VBAエラーではありません。 '{...}'コードで確実に生成されます。デバッガを使用してコードをステップ実行するか、例外がスローされたときに停止します。プロジェクト>プロパティ>デバッグタブ>外部プログラムの開始を選択します。 –
特定の問題の原因ではありませんが、VBAもVB6も実際に[out]パラメータをサポートしていないことに注意してください。彼らは、彼らを[in、out]として扱うことによってできるだけ偽装します。あなたのCOMクライアントがVB6またはVBAの場合は、代わりに[in、out]を使用してください。この場合、 .NET/COM Interopが冗談になっていることを確認します。 –