InternalsVisibleTo不起作用

时间:2013-09-17 09:06:35

标签: c# internalsvisibleto

我插入一行:

[assembly: InternalsVisibleTo("MyTests")]

在我的测试项目(Properties/AssemblyInfo.cs)中,其中MyTests是单元测试项目的名称。但由于某种原因,我仍然无法从单元测试项目中访问内部方法。

关于我做错了什么的想法?

6 个答案:

答案 0 :(得分:51)

如果您的程序集使用强名称look at this answer进行签名。

否则检查测试程序集的名称是否真的是“MyTests.dll”(它不必与项目名称匹配,但默认情况下也是如此)。

答案 1 :(得分:12)

让我们分解一下,因为我们很多人在过去经历过这种轻微的混乱......

程序集A有你的内部类。 装配B进行了单元测试。

您希望在程序集B中授予程序集A内部的可见性。

您需要将InternalsVisibleTo程序集属性放在程序集A中并授予对程序集B的访问权限。

答案 2 :(得分:3)

您仍然需要测试项目来引用您的主项目。

这很容易被忽视,如果您没有现有的测试代码,这可能看起来像InternalsVisibleTo无效。

答案 3 :(得分:3)

在我的情况下,我正在编写一个接口。由于接口只能指定公共属性,因此接口上不存在内部属性。

确保你没有像我那样做同样的事情!

我改变了:

Assert.IsNotNull((exportFileManager)?.ThumbnailFileExporter);

要:

Assert.IsNotNull((exportFileManager as ExportFileManager)?.ThumbnailFileExporter);

答案 4 :(得分:0)

您只能将内部名称从强命名程序集公开给另一个强命名朋友程序集。但是非强命名程序集可以使内部对象暴露于强命名朋友程序中。

答案 5 :(得分:0)

重命名名称空间后,我遇到了同样的问题。基本上.cs文件中的ins是新的名称空间,而在.csprojAssemblyInfo.cs中,它是旧的名称空间。

namespace newNamespace {
   ....
}

因此,我在.csproj中更改了以下名称空间:

    <RootNamespace>oldnamespace</RootNamespace>
    <AssemblyName>oldnamespace</AssemblyName>

在AssemblyInfo.cs中:

[assembly: AssemblyTitle("oldnamespace")]
[assembly: AssemblyProduct("oldnamespace")]