現在のプロジェクトでは、DBus (1.6.n) を使用しています。主に C++ から共有メモリ モードでアクセスされますが、これは非常にうまく機能します。
現在、C# プログラムから同じ DBus にアクセスしようとしています。
最初に試してみるために、見つけた最新バージョンの dbus-sharp をダウンロードし、ダウンロードに含まれているデーモンを起動して、テスト C# アプリから接続できるかどうかを確認しました。
接続を確立するたびに、デーモン コンソールは通信中であることを示しますが、接続上のメソッドにアクセスしようとするとすぐにエラーが発生します。
「アクセスが拒否されました: DBus.BusObject」
これが私が試したコードです。
DBus.Bus dBus = null;
try
{
//input address comes from the UI and ends up as "tcp:host=localhost,port=12345";
//dBus = new Bus(InputAddress.Text + inputAddressExtension.Text);
//string s = dBus.GetId();
//dBus.Close();
//DBus.Bus bus = DBus.Bus.System;
//DBus.Bus bus = Bus.Open(InputAddress.Text + inputAddressExtension.Text);
//DBus.Bus bus = DBus.Bus.Session;
//DBus.Bus bus = DBus.Bus.Starter;
var conn = Connection.Open(InputAddress.Text + inputAddressExtension.Text);
var bus = conn.GetObject<Introspectable>(@"org.freedesktop.DBus.Introspectable", new ObjectPath("/org/freedesktop/DBus/Introspectable"));
bus.Introspect();
}
finally
{
if(dBus != null)
dBus.Close();
}
コメント付きのコードでも、最終的には同じエラーが発生します。
私はデバッガーをステップ実行しましたが、常に TypeImplementer.cs の次のコードに到達します。
public Type GetImplementation (Type declType) { Type retT;
lock (getImplLock)
if (map.TryGetValue (declType, out retT))
return retT;
string proxyName = declType.FullName + "Proxy";
Type parentType;
if (declType.IsInterface)
parentType = typeof (BusObject);
else
parentType = declType;
TypeBuilder typeB = modB.DefineType (proxyName, TypeAttributes.Class | TypeAttributes.Public, parentType);
if (declType.IsInterface)
Implement (typeB, declType);
foreach (Type iface in declType.GetInterfaces ())
Implement (typeB, iface);
retT = typeB.CreateType (); <======== Fails here ==========
lock (getImplLock)
map[declType] = retT;
return retT;
}
C# からの DBus へのアクセスに関する有用な例やドキュメントは見つかりませんでした。これに関する最近のエントリはどこにもないように思われるため、他の誰もこれを試していない可能性があります。
テストプログラムと同じフォルダーでデーモンを実行しています。Windows で実行しているため、デーモンは tcp 設定をリッスンしています。
string addr = "tcp:host=localhost,port=12345";
これはダウンロードに含まれている例なので、簡単に実行できると思いましたが、残念ながらまだうまくいきません。
他の誰かがここにいて、パズルの次のピースを知っていますか?
どんなアイデアでも大歓迎です。