10

我最近听说 .dll 可以在加载后立即运行代码,例如,当加载引用 .dll 的应用程序时。事件虽然我自己做了一些测试并尝试在这里寻找答案,但在谷歌上我无法找到某种方法来为 .dll 生成初始化方法。

我想知道在应用程序加载时是否真的可以从.dll 运行代码。

如果是这样,我该怎么做?

4

3 回答 3

8

警告(感谢Ben Voigt的发现 :)):以下代码仅适用于C#,它保证生成的类不会是 beforefieldinit。但是使用C++/CLI不应该那么容易工作:Managed C++ Static Constructor not called in .net4


因此,正如我在评论中所述,您可以使用以下内容:

using System;

class MyAwesomeLibrary
{
    static MyAwesomeLibrary()
    {
        Console.WriteLine(string.Format("Hey {0} is using me!", Environment.UserName));
    }
    
    public static int GetTheAnswer()
    {
        return 42;
    }
}

class Client
{
    static void Main()
    {
        Console.WriteLine("The answer is: " + MyAwesomeLibrary.GetTheAnswer());
    }
}

在静态构造函数中,您可以执行高级操作,例如检查注册表、与服务器通信……

如果您是坏人(或者只是想要保护其权利的开发人员/公司),您可以抛出异常:

throw new Exception("The library has not been correctly registered...");

这将导致TypeInitializationException阻止使用整个库类。

或者您可以实现一个CheckMe方法,并要求所有用户在使用库之前调用它,甚至进行身份验证并获取他们每次使用某些东西时将使用的安全令牌......

编辑:

无论您使用何种保护措施,一个坚定的攻击者都可以通过反编译库来绕过所有的管道,因此如果可以的话,您也应该混淆您的库以(稍微)受到更多保护。

于 2013-06-15T18:51:52.713 回答
2

好久不见评论...

请注意,将重要的代码(即慢速远程网络调用)放入任何类型的启动代码(如重要类的静态构造函数)会疏远您的库的用户。它可能会迫使他们编写特殊代码以避免加载/方法调用的随机延迟。

简单地在库中使用“验证许可证”方法可能是更好的解决方案。

请注意,“电话回家”功能本身通常不太受用户欢迎,最好有据可查。特别是如果您希望您的库可用作其他程序的一部分。

于 2013-06-15T19:05:31.570 回答
-1

您可以在应用程序构造函数中调用 dll 代码。这是解决程序集的点。

于 2013-06-15T18:43:09.653 回答