|
不使用GAC好象比较困难. 放在一个地方理论上好象是可行的. Assembly.Load方法可以指定路径. 但是使用起来还是不方便吧....
3. 这个应该是有确定性的吧,如果需要被覆写才作标记,如果不需要覆写那就不要标. 1,我更推荐每个程序都复制一份自己的私有程序集.这样部署起来更简单,单独升级也更容易.这也正是.Net的一个目标:XCopy部署. 如果一定要共享,我觉得还是放到GAC比较合适,因为GAC不仅仅是一个文件夹,它还有版本管理的功能,能在很大程度上避免dll hell. 2,可以,通过反射(Assembly.Load***),动态加载程序集. 不过这样一来就失去了"程序集一旦被修改,就自动重启AppDomain"的好处,可能还有很多其它方面需要注意和处理. 3,添加一个中间类,里面用new关键字重新定义一个与父类相同签名和访问公开性的非虚拟方法. 其实,这样的需求,倒不如不用继承,而是把父类拆分为几个接口,然后用Extension methods分别给不同的接口添加不同的方法.博客园前一段有人讨论过这种设计方法. 1—— 在.NET应用中,假如一个DLL想给多个应用程序共享,常规方案是注册到GAC,但这个方案很麻烦,需要注册,容易产生垃圾。 这个好解决: 1.在环境变量中设置DEVPATH到任意目录 2.在config中加入 <configuration> <runtime> <developmentMode developerInstallation="true" /> </runtime> </configuration> 3.把dll拷贝到DEVPATH设置的目录中 问题2同1的解决方式一样 至于问题3,何必呢 :) 补充ls的回答 LoadFrom方法不需要指定程序集的版本号以及PublicToken,所以如果只有一个dll,还是比较方便的,Assembly.Load方法则需要指定版本号还有PublicToken,对于经常更新的dll,则需要经常更新这个方法的参数了,不过可以写在配置文件中啊,方便 对于问题一和二,其实都没必要,增加开发成本,同时这也是一种耦合的加强而已。 问题三 如果子类和父类不在一个dll中,比如 子类 class child 在child dll中,父类 class father 在 father.dll 那么只需要把father 里面的 virtual 方法定义个一个只有father.dll可见的类型。abstract方法则是必须实现的,否则编译都通不过的。 如果在同一个dll中,做这件事情是没有意义的,如果一个类不能继承,其他类都不能继承,那还virtual 什么?为了降低性能? |
|
6个月前 笨笨蜗牛 : 谢谢各位的解答。 对各位的解答我做以下解释: 1—— 这个问题,如果是桌面应用问题不大,可以接受。 2—— 这个问题同问题 1,但这里是强调了WEB应用,是自己的服务器,服务器上配置了若干完全独立的站点,各站点都使用公共的基础类库(自己开发的),由于考虑代码的一致性问题,如果采用XCOPY的方式发布,容易不一致,所以有了这个想法。 对这个问题,如果使用GAC,基于WEB应用的特点,肯定不现实,毕竟自己开发的基础模块也是在不断完善中的,每次发布新版本都必须系统管理员参与,可行性可想而知。 似乎 3 楼 MICYNG 的解决方案可行,测试下先。 3—— 这个问题牵涉到的是 基于 MS 发布的类库。主要是:page 类的 render 方法。 我想控制基于自己开发的继承自 System.Web.Page 的类的 可重载方法 Render 在这个类的 派生子类 中 不允许 重载:或者抛出异常,或者只能是new的方式。 |
|
5个月前 笨笨蜗牛 : 在我之前的应用中使用以下配置: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="bin"/> </assemblyBinding> </runtime> 解决了模块放置在不同文件夹的问题,但是 1—— 这个privatepath必须是应用的下级子目录,不能是其它完整的应用路径,即便使用“../”父路径都不可以。 2—— 通过linkd命令方式连接的逻辑文件夹,也不认,好象必须是纯粹的物理文件夹 此外,micYng提供的使用DEVPATH的方法实验了,失败,不知道是否我做错了。 |