我想在C#中使用一个大类库-dll中的单个方法。
性能或其他方面是否有任何缺点?
我应该用反射工具“读取”方法代码并将其复制粘贴到我的项目中吗?
更新:硬盘空间不是问题。我的应用程序是网络应用程序。
答案 0 :(得分:7)
性能或其他方面有任何缺点吗?
唯一真正重要的是可分发的大小,如果它对你很重要的话。 (用户下载30 MB文件而不是2 MB文件)。性能差异可以忽略不计。程序集绑定和验证强名称(如果已签名)哈希可能需要更长时间,但不太可能引起用户注意。
我应该用反射工具“读取”方法代码并将其复制粘贴到我的项目中吗?
可能不是;大多数许可条款禁止逆向工程和/或仅部分分发。检查许可证(如果有),看看您是否可以先执行此操作。
答案 1 :(得分:3)
不,请将其留给JIT编译器。它已经选择IL实际变成机器代码,它只编译实际执行的内容。你将失去一些虚拟内存地址空间,但这不会花费任何东西,它是虚拟的。你不支付你不使用的东西。
答案 2 :(得分:1)
成本是磁盘空间,加载时间和内存占用。 JIT编译器只会编译您调用的内容(可能需要注意这一点,但它肯定不会编译整个程序集)。关于你是否值得“扯掉”你需要的方法,这是你的号召。记住当然这可能是一个兔子洞,我的意思是这个方法很可能在它的程序集中使用其他类,所以它可能不像你想象的那样简单地提取你需要的代码。
答案 3 :(得分:1)
Bah,在极端情况下需要极端的黑客攻击。复制方法代码(如果可能的话)是极端黑客,imo。
如果只是沮丧地使用不必要的内存,但基本上相当实惠的解决方案,就像你继续做的那样。简单易行。
如果存在内存问题,并且该方法调用过于频繁(太频繁取决于您的项目),您可以尝试加载它在外部AppDomain
中,并在您完成一次后卸载该域。在这种情况下,您确实需要注意IPC管理。这个世界上没有任何东西是免费的。
您可以尝试执行您所写的内容。用户反射器(或类似软件),获取方法C#代码并创建其克隆。所有这些假设该方法不使用DLL的内部结构,状态或其他,导致在这种情况下故事变得相当复杂。