Может ли Reflection помочь мне вызвать функцию во внедренной DLL? - PullRequest
0 голосов
/ 15 декабря 2010

Я внедрил управляемую .NET DLL в процесс .NET.
Я видел, что некоторые люди в StackOverflow говорят, что затем вы можете вызывать функции внедренной DLL с помощью Reflection. Это, очевидно, методика, которую использует Snoop.
Это правильно? Если да, то как именно это можно сделать?
Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 15 декабря 2010

Вы можете использовать отражение.Вот пример:

class Program
{
    static void Main()
    {
        var assembly = Assembly.Load("System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
        var serverType = assembly.GetType("System.Web.HttpUtility", true);
        var method = serverType.GetMethod("HtmlEncode", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(string) }, null);
        var result = method.Invoke(null, new[] { "<some value>" });
        Console.WriteLine(result);
    }
}
0 голосов
/ 15 декабря 2010

Отличная статья Эрика Ганнерсона, единственное предостережение - следить за политиками безопасности, поскольку они могут когда-нибудь предотвратить динамическую загрузку сборок.

http://blogs.msdn.com/b/ericgu/archive/2007/06/05/app-domains-and-dynamic-loading-the-lost-columns.aspx

0 голосов
/ 15 декабря 2010

Вот пример кода для этого:

        // Get all loaded assemblies in current application domain
        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

        // Get type of int
        Type intType = assemblies.Select(a => a.GetType("System.Int32")).First();

        // Create object of int using its type
        Object intObj = Activator.CreateInstance(intType);

        // Call int.ToString() method which returns '0'
        String result = intObj.GetType().GetMethod("ToString", new Type[] { }).Invoke(intObj, null).ToString();
0 голосов
/ 15 декабря 2010
...