对于我们当前的项目,我们使用的是DBus(1.6.n)。 它主要是在共享内存模式下从C ++访问的,这非常有用。
我现在正试图从C#程序访问相同的DBus。
为了先尝试一下,我下载了我能找到的最新版dbus-sharp,并启动了下载中包含的守护进程,看看我是否可以从我的测试C#app连接到它。
每当我建立连接时,守护程序控制台都会显示我正在与之通信,但是一旦我尝试访问连接上的任何方法,我就会收到错误;
'拒绝访问: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) { 输入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”;
由于这是下载中包含的示例,我认为它很容易实现,但是还没有运气。
有没有其他人来过这里并知道下一部分的谜题?
任何想法都会受到赞赏。
答案 0 :(得分:1)
在没有收到任何评论或回复的情况下,我将回答这个问题,并提供自我提出以来所发现的信息。
DBus似乎没有有用的C#接口。 (有用的,我的意思是一个有效!) 我能找到的唯一信息或示例并不是最新的,似乎没有花费任何精力来提供工作界面。
我决定使用作为Windows服务编写的C ++实现与DBus接口,我的C#程序将通过该服务向DBus发送消息。这似乎工作正常,因此满足了业务需求。
我很失望不能让C#工作到DBus,但是有许多服务总线实现可以在Windows上运行,因此将来我会考虑实现那些而不是DBus。
如果有人想出一个可行的,有文档记录的解决方案来从Windows上的C#访问DBus,我仍然有兴趣看到它。
答案 1 :(得分:0)
当我创建新的测试项目并将dbus cs源文件添加到主项目程序集时,我遇到了同样的错误。当动态创建的程序集中动态创建IBusProxy类型时。
asmB = AppDomain.CurrentDomain.DefineDynamicAssembly (new AssemblyName ("NDesk.DBus.Proxies"), canSave ? AssemblyBuilderAccess.RunAndSave : AssemblyBuilderAccess.Run);
modB = asmB.DefineDynamicModule ("NDesk.DBus.Proxies");
......
retT = typeB.CreateType ();
我认为这是因为当前运行的程序集对于创建的程序集不友好。就在我添加到项目编译的NDesk.DBus.dll时,这个错误就消失了。