[英]How to send unmanaged function pointers from dll to another unmanaged function in other dll through managed code?
[英]How to automatically Proxy a DLL(managed) through another DLL(managed)?
我有一个奇怪的要求,
其实我们的解决方案是这样的:
APP.EXE
MYDLL
汇编方法。
现在客户端请求实现此变体:
MYDLL_PROXY.DLL 必须充当代理,因此调用“MYDLL_PROXY.Method1”将加载外部 MYDLL.DLL 并在其上调用 Method1 并返回结果。
像这样的反射:
//MYDLL_PROXY.dll
ass = Assembly.LoadFrom(@"C:\mydll.dll");
String MyGenericMethod ="Something"
Type MyType = ass.GetTypes()[0];
Object o = Activator.CreateInstance(MyType);
MethodInfo Method = ass.GetTypes()[0].GetMethod(MyGenericMethod);
return Method.Invoke(null, new object[] { /* parameters go here */ });
所以,在生气之前,有一种快速的方法可以创建一个假的 dll,它充当另一个 dll 的代理?
我需要代理所有:方法、属性、事件。
谢谢你的帮助。
注意:是一个旧项目,必须与 Framework 2.0 保持一致
更新
如果反射不是正确的方式,像这样的封装可能吗? 事件呢?
外部DLL:
public class NastyExternalClassInExternalDll
{
public void Foo() { ... }
}
主DLL:
public interface IFooable
{
void Foo();
}
public sealed class NastyExternalClassWrapper : IFooable
{
private readonly NastyExternalClassInExternalDll original;
public NastyExternalClassWrapper(NastyExternalClass original)
{
this.original = original;
}
public void Foo()
{
original.Foo();
}
}
一种方法是使用您在问题中写的接口并包装所有方法\\属性。 对于事件,您还需要在代理中向它们注册并采取行动。
另一种方法是通过重写概念来实现。 这可以通过两种方法进行。
静态:读取原始 dll(使用 cecil、dnlib 等),对于您鼓励的每个方法或属性,调用您的代理代码,然后继续实际代码。 毕竟,那编织,保存dll就大功告成了。 静态方法的缺点是对于原始dll 的每次更改,都需要再次运行包装器。
动态地:将 CLR Profiler 附加到原始 dll,并在任何方法或属性调用之前拦截对您的代码的所有调用。
对于这些方法中的每一种,我无法在这里深入介绍,因为它会很长,但是您可以阅读它们,如果您有具体问题,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.