.Net DLL每次编译都需要重新注册
Posted
技术标签:
【中文标题】.Net DLL每次编译都需要重新注册【英文标题】:.Net DLL needs registering again each time it is compiled 【发布时间】:2020-08-28 10:39:45 【问题描述】:我有一个暴露给 COM 的 .Net 4.5 DLL。我通常使用管理权限向 regasm dllname /tlb /codebase 注册它,一切运行正常。
然后我对代码做了一些更改;它不涉及更改方法名称,更改参数或添加/删除新方法,只是更改内部逻辑。当我构建 DLL 并替换它时,使用 DLL 的程序可以调用这些方法,直到我再次注册 DLL。
就好像每次构建都会在 DLL 中更改某些内容,并且不再识别这些方法。不用说,公开的类被分配了正确的 GUID,程序集也有正确的 GUID,并且在构建之间不会发生变化。
有什么线索吗?
【问题讨论】:
【参考方案1】:对于 COM 公开的 dot net dll .tlb 文件用于识别类型和功能。重新编译 dll 更改后,.tlb 文件适用于旧版本的 dll。因此它不起作用。每次构建 dll 时,都需要重新创建 .tlb 文件。
【讨论】:
从你说的我的理解是,如果我替换了dll和tlb文件(两者),那么不需要再次注册dll?对吗? 根据我的经验,它并不总是有效。请查看以下链接。 ***.com/questions/16661056/…【参考方案2】:您是否将项目构建配置检查为“注册 COM 互操作”?
/// <summary>
/// Summary description for CustomESRIBaseTool.
/// </summary>
[Guid("8d6dc751-0e58-46a6-8233-807b3d75a9fa")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("BaseTools.CustomESRIBaseTool")]
public class CustomESRIBaseTool : BaseTool
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
//
// TODO: Add any COM registration code here
//
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
//
// TODO: Add any COM unregistration code here
//
#endregion
【讨论】:
没有勾选,因为它只在我的开发机器上注册了dll,相当于我手动做regasm注册。这意味着每次Visual Studio构建DLL时它都会在我的开发机器中注册它,这正是我不想要的,因为DLL已经注册了,我只想替换而不需要再次注册。跨度> 我习惯于使用和创建新的 COM 对象来开发扩展,我创建新 COM 对象的项目总是被检查为 COM 互操作,这个选项使 .net 生成 .tlb 文件。 说的没错,但是就像我提到的,我可以自己手动注册dll并生成tlb文件。我不希望对 dll 的每个构建都这样做,因为我没有更改公开的类或方法的接口或签名,我只是更改了一些内部逻辑。 我编辑了答案,在我的类中添加了一个带有 COM RegisterFunction 方法的示例,你的代码中有类似的东西吗? 不,我没有类似的东西,因为注册/取消注册是通过使用 regasm.exe (regasm /tlb /codebase) 手动处理的。 DLL 确实公开了要使用的方法: [ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]【参考方案3】:感谢所有答案,但他们确实没有解决我为什么每次都需要注册 dll 的问题。最后我决定做的是使用 RegFree COM,创建一个清单文件,所以现在我根本不需要注册任何 dll。
【讨论】:
以上是关于.Net DLL每次编译都需要重新注册的主要内容,如果未能解决你的问题,请参考以下文章
如果从命令行运行 Julia 脚本,是不是每次都需要重新编译?