微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如果你没有引用它的所有依赖项,你可以使用类库吗?

让我澄清一下:

我已经构建了一个类库,可以在几个项目中使用.作为此DLL的一部分,我想通过扩展CookieAuthenticationProvider为Owin Cookie添加一些不同的自定义提供程序,因此我需要包含对Microsoft.Owin.Security.Cookies的引用.这是安全的,因为将使用我的库的较新项目也使用Microsoft.Owin.Security.Cookies.

然而,有些项目比较老,不使用Owin等…如果我将库包含在其他用途​​中会不会爆炸?或者,如果我尝试使用提供者,他们只会爆炸(我不会因为他们不能使用它).

我想在我的库中放入一些常用的东西,而不必将每个依赖的DLL引用到每个使用它们的项目中.我很确定我正在做的事情还可以,但是我希望somone可以在我浪费很多时间之前告诉我.如果有更好的方式,我全都耳朵.

解决方法

规则:

>对于给定程序集可见的所有类型必须在该程序集引用的程序集中声明.只要您的类库实际上不在其公共API中公开Microsoft.Owin.Security.Cookies程序集中找到的类型,那么其他程序集可以使用您的DLL安全地编译,而无需引用该程序集.
>引用的程序集不需要在运行时出现,除非实际需要该程序集中的代码,即某些其他代码试图调用代码.
通常,这意味着只要引用您的程序集并且不引用Microsoft.Owin.Security.Cookies的其他程序集也不会调用程序集中的任何代码,然后这些代码将依次尝试在Microsoft中调用代码.Owin.Security.Cookies,该程序集不需要在运行时出现.

关于第二点的棘手部分是什么构成“在Microsoft.Owin.Security.Cookies中调用代码”并不总是清楚的.通常,只要您根本不访问程序集中的类型,.NET就不会尝试执行该程序集中的任何代码.但是,即使不一定需要它们,也不难意外地访问类型(例如,在初始化器,静态或其他方面,检查接口实现的代码等).

如果您真的希望您的客户能够使用引用Microsoft.Owin.Security.Cookies的DLL,而不需要在运行时出现该DLL,则需要非常小心以确保您完全支持场景.这是可能的,但也不难犯错误.

(我不得不承认,我很惊讶这个有用的问题还没有在Stack Overflow上得到解决.看起来它现在已经出现了.但我无法找到重复,因此上面的答案.如果任何人都知道我忽略了一个副本,我欢迎任何适当的通知.)

原文地址:https://www.jb51.cc/csharp/99368.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐