生成.dll的初始化代码

时间:2013-06-15 18:37:55

标签: c# c++-cli

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

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

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

3 个答案:

答案 0 :(得分: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 方法,并要求所有用户在使用库之前调用它,甚至要进行身份验证并获取每次使用时都会使用的安全令牌......

编辑:

无论您使用何种保护措施,确定的攻击者都可以通过反编译库来规避所有管道,如果可以的话,您应该模糊您的库,以便(稍微)更多地受到保护。

答案 1 :(得分:2)

渴望评论......

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

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

请注意,“手机之家”功能本身通常不受用户欢迎,并且更好地记录在案。特别是如果您希望您的库可以作为其他程序的一部分使用。

答案 2 :(得分:-1)

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