c# - 为 .dll 生成初始化代码

标签 c# c++-cli

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

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

如果可以,我该怎么做?

最佳答案

警告(感谢 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 方法并要求所有用户在使用该库之前调用它,甚至进行身份验证并获取他们每次使用某些东西时都会使用的安全 token ...

编辑:

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

关于c# - 为 .dll 生成初始化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17126779/

相关文章:

C# Mysql 出现 fatal error

c# - 为什么 'unbox.any' 不像 'castclass' 那样提供有用的异常文本?

c++ - 组合函数、绑定(bind)、C++ 和托管代码

c# - 从 native C++ 或 C 调用 C# 函数

c# - 如何正确部署托管/非托管 C++ 库

c# - 如何在不终止方法的情况下传递异常

c# - 无论如何进一步缩写这段代码?

c# - MVC5 中的 Bootstrap 模态

crash - 在 Visual Studio 2015 Update 1 中从 Post-Build 事件执行 AL.EXE 时出现错误 -1073741819 (0xC0000005)

visual-studio - 如何在 C++/CLI 中将托管引用传递给非托管代码?