C# - 如何使程序集具有强名称

本文关键字:强名称 程序集 何使 | 更新日期: 2023-09-27 18:30:31

我正在尝试为我的一些私有方法创建单元测试,我读到您可以通过[assembly: InternalsVisibleTo("DLLName")]从单元测试中访问它们。

但是,我的不起作用,另一种解决方案是添加公钥。我试图通过sn -Tp DLLName获取我的单元测试项目的公钥,但它抱怨它没有强名称。

我怎样才能使它被强命名?我是否以错误的方式使用InternalsVisibleTo

C# - 如何使程序集具有强名称

我认为

如果您转到项目的属性,则在侧边栏上应该有一个名为"签名"的导航链接。应该有一个对程序集进行签名的选项。如果不存在,那么我认为你不能给它一个强有力的名字吗?

您的单元测试程序集目前可能没有强命名 - 毕竟,这是一个相对不寻常的要求,因为强命名的原因通常不适用于测试程序集。

但是,使用 InternalsVisibleTo 确实需要这样做 - 因为这有点像您将从强名称的生产程序集添加到测试程序集的引用,并且不能从强名称程序集引用非强名称程序集。

因此,只需以与生产程序集相同的方式(项目属性、签名)使测试程序集具有强名称,为其提供一个密钥(例如,与生产程序集相同的密钥),然后使用 sn -Tp 获取公钥。

所有这些都是假设您的原始InternalsVisibleTo尝试不起作用的原因是因为生产程序集具有强名称。如果不是,则对测试程序集进行签名根本无济于事,您需要向我们提供有关您看到的问题的详细信息。

使用程序集链接器创建具有强名称的程序集并对其进行签名

在命令提示符下,键入以下命令:

al /out:<assembly name> <module name> /keyfile:<file name>
在此命令中,程序集名称是要使用强名称进行签名的程序集的名称,模块

名称是用于创建程序集的代码模块的名称,文件名是包含密钥对的容器或文件的名称。下面的示例使用密钥文件 sgKey.snk 对程序集 MyAssembly.dll 进行强名称签名。

al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk