私はVBAプログラムで使用しているC#、Visual Studio 2010、.NET 3.5、x86 でCOMオブジェクトを開発しています。VBからのCOMオブジェクト配列
namespace Test
{
[Guid("8b65089f-5d98-41e7-9579-1ee384948e4c")]
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Contact
{
[MarshalAs(UnmanagedType.BStr)]
public string Test1;
public string[] Array;
}
[Guid("8b65082f-5d98-41e7-9579-1ee384948e4e"), ComVisible(true)]
public interface IInContainer
{
Contact[] Contacts { [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] get; set; }
string[] strings { [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] get; set; }
}
[Guid("8b65089f-5d98-41e7-9579-1ee384948e4b"), ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
public class InContainer
{
//[MarshalAs(UnmanagedType.BStr)]
public Contact[] Contacts { get;set;}
public string[] strings { get; set; }
}
}
VBでオブジェクトの構造/インタフェースを見ることができます。
私はContainer.stringsの情報をVBからVBで変更することができます。
しかし、VB経由でContact配列(Contact構造体を使用)の情報を変更することはできません。
連絡先配列は長さが1で、そのノードのすべての値が「テスト」に設定されているとします。 VB経由で変更しようとしたとき、つまりContainer.Contact(0).Test1 = "Monkey"
はエラーになりません。つまり、Print(Container.Contact(0).Test1)
の直後にそれを読み込もうとすると、私は "" "などの何らかのデフォルト文字列を取得します。
私は連絡先の情報をコンテナオブジェクトのメソッドを使用して変更できますが、これは望ましくありません。
私はなぜ値がContainer.Contact配列でのみ読み込まれるのか助けが必要です。
"望ましくない"ということを避けるために、実際には約十ダースの方法を使用するコードを書いたことがありますが、依然として仕事を完了することはありません。これのポイントは何でしたか?あなたは実際に*コードのコストを測定しましたか?あなたの選択肢が何千倍も遅いことを知るための本当の方法は、VBAはどんな種類のコードが実行されているかを知る他の良い方法を提供しません。 –