抱歉,我想不出更好的方式来表达这个问题。我理解反思。我有自己的伪 WAMP 协议自行车 =) 我想通过 RPC 远程调用方法。因为我了解反射,所以我想让应用程序可扩展。那些。这样将来我就可以编写一个插件库。将其放入 wamp-server 文件夹并远程使用它。
实际上,当我在我的库中使用指向其他库的链接时,问题就出现了。服务器本身看不到第二个库,因此无法从我的库中执行该方法。
除了我的图书馆之外,我还可以如何连接我所引用的那些?
目前的方法是:
private string CallInvoke(WebSocketSession session, Call call)
{
try
{
string filepath = Environment.CurrentDirectory + "/Plugins/" + call.PluginFileName;
//Если файл плагина не найден
if (!File.Exists(filepath))
{
CallError callError = new CallError(call.CallId, "Plugin file not found.\r\n(" + filepath + ")");
return JsonSerialize(callError);
}
Assembly asm = Assembly.LoadFile(filepath);
Type _class = null;
MethodInfo _method = null;
var types = asm.GetTypes();
//Если в плагине нет нужного класса
if (types.Count(x => x.Name == call.ClassName) == 0)
{
CallError callError = new CallError(call.CallId, "Class \"" + call.ClassName + "\" not found in assembly \"" + asm.FullName + "\".");
return JsonSerialize(callError);
}
_class = types.Single(x => x.Name == call.ClassName);
var methodInfos = _class.GetMethods();
//Если в классе нет нужного метода
if (methodInfos.Count(x => x.Name == call.MethodName) == 0)
{
CallError callError = new CallError(call.CallId, "Method \"" + call.MethodName + "\" not found in class \"" + call.ClassName + "\".");
return JsonSerialize(callError);
}
_method = methodInfos.Single(x => x.Name == call.MethodName);
object result = null;
if (call.Params is null)
result = _method.Invoke(null, null);
else
result = _method.Invoke(null, new object[] { call.Params });
CallResult callResult = new CallResult(call.CallId, result);
return JsonSerialize(callResult);
}catch(Exception ex)
{
CallError callError = new CallError(call.CallId, ex.Message);
return JsonSerialize(callError);
}
}
.NET 看不到依赖库,因为它不在应用程序目录中。
最简单的方法是将插件及其所有依赖项直接放在应用程序目录中,不用担心。并通过 加载程序集
Assembly.Load,这是最正确的方法。如果您真的非常想要,您可以在 app.config 中设置程序集探测路径:(并且仍然使用
Assembly.Load)。更多细节在这里:如何设置输出项目的结构?