如何在 DNN Manifest 中正确引用程序集?
How to Properly Reference Assemblies in DNN Manifest?
我正在使用 ASP.NET MVC 编写 DNN 9 自定义模块。我的开发站点设置在 dnndev.me,模块位于 C:\websites\dnndev.me\DesktopModules\MVC|MyModule
我的 DNN 清单如下:
<dotnetnuke type="Package" version="5.0">
<packages>
<package name="Onboarding" type="Module" version="00.00.05">
<friendlyName>Onboarding</friendlyName>
<description>Onboarding</description>
<iconFile>~/Icons/Sigma/Software_32X32_Standard.png</iconFile>
<owner>
<name>example.com</name>
<organization>example.com</organization>
<url>https://example.com/</url>
<email>info@example.com</email>
</owner>
<license src="License.txt"></license>
<releaseNotes src="ReleaseNotes.txt"></releaseNotes>
<dependencies>
<dependency type="CoreVersion">08.00.00</dependency>
</dependencies>
<components>
<component type="Script">
<scripts>
<basePath>DesktopModules\MVC\MyModule</basePath>
<script type="Install">
<path>Providers\DataProviders\SqlDataProvider</path>
<name>00.00.01.SqlDataProvider</name>
<version>00.00.01</version>
</script>
<script type="UnInstall">
<path>Providers\DataProviders\SqlDataProvider</path>
<name>Uninstall.SqlDataProvider</name>
<version>00.00.01</version>
</script>
</scripts>
</component>
<component type="ResourceFile">
<resourceFiles>
<basePath>DesktopModules/MVC/MyModule</basePath>
<resourceFile>
<name>Resources.zip</name>
</resourceFile>
</resourceFiles>
</component>
<component type="Module">
<desktopModule>
<moduleName>Onboarding</moduleName>
<foldername>Onboarding</foldername>
<businessControllerClass>MySite.Modules.Onboarding.Components.FeatureController</businessControllerClass>
<supportedFeatures />
<moduleDefinitions>
<moduleDefinition>
<friendlyName>Onboarding</friendlyName>
<defaultCacheTime>0</defaultCacheTime>
<moduleControls>
<moduleControl>
<controlKey />
<controlSrc>Example.Modules.Onboarding.Controllers/Onboarding/Index.mvc</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle />
<controlType>View</controlType>
<iconFile />
<helpUrl />
<viewOrder>0</viewOrder>
</moduleControl>
<moduleControl>
<controlKey>Edit</controlKey>
<controlSrc>Example.Modules.Onboarding.Controllers/Onboarding/Edit.mvc</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle>Edit Onboarding Records</controlTitle>
<controlType>Edit</controlType>
<iconFile />
<helpUrl />
<viewOrder>0</viewOrder>
<supportsPopUps>True</supportsPopUps>
</moduleControl>
<moduleControl>
<controlKey>Settings</controlKey>
<controlSrc>Example.Modules.Onboarding.Controllers/Settings/Settings.mvc</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle>Onboarding Settings</controlTitle>
<controlType>Edit</controlType>
<iconFile />
<helpUrl />
<viewOrder>0</viewOrder>
</moduleControl>
</moduleControls>
</moduleDefinition>
</moduleDefinitions>
</desktopModule>
</component>
<component type="Assembly">
<assemblies>
<assembly>
<name>Onboarding.dll</name>
<path>bin</path>
</assembly>
<assembly>
<name>RestSharp.dll</name>
<path>bin</path>
</assembly>
<assembly>
<name>EntityFramework.dll</name>
<path>bin</path>
</assembly>
<assembly>
<name>EntityFramework.SqlServer.dll</name>
<path>bin</path>
</assembly>
<assembly>
<name>Newtonsoft.Json.dll</name>
<path>bin</path>
</assembly>
</assemblies>
</component>
</components>
</package>
尽管确保所有程序集都在 dnndev.me 下的 bin 文件夹中,但模块不会安装。
我必须怎么做才能纠正这个问题?
您这样做意味着程序集包含在您的安装包中。要测试程序集是否已安装(在 bin 文件夹中),您需要添加依赖项,但不存在对包含版本号或类似内容的程序集的依赖项。诀窍是将依赖项添加到程序集中定义的类型,例如
<dependency type="Type">DocumentFormat.OpenXml.Extensions.WorksheetWriter</dependency>
AFAIR 类型属性的值区分大小写很重要,因此它必须是 "Type",而不是 "type" 或 "TYPE"。
如果您使用 Chris Hammond 模板构建 MVC 模块,您将拥有用于打包由文件驱动的模块的 msbuild 过程:BuildScripts/ModulePackage.targets
在该文件中,有一行代码:
<Copy SourceFiles="$(MSBuildDnnBinPath)$(AssemblyName).dll" DestinationFolder="$(MSBuildProjectDirectory)\Package\bin"/>
它负责在本地安装的 bin 文件夹中获取模块的程序集,并将其复制到要压缩的包文件夹中。没有用于在其中包含其他自定义 dll 的自动化步骤。此行出现两次:一次针对 'source' 包,另一次针对 'install' 包。
大多数时候,我只会更新此脚本以包含我的依赖项。示例:
<Copy SourceFiles="$(MSBuildDnnBinPath)$(AssemblyName).dll" DestinationFolder="$(MSBuildProjectDirectory)\Package\bin"/>
<Copy SourceFiles="$(MSBuildDnnBinPath)\Onboarding.dll" DestinationFolder="$(MSBuildProjectDirectory)\Package\bin"/>
这不是最优雅的解决方案,因为您需要在构建脚本中对依赖项进行硬编码。但它适用于简单的模块。如果您对 msbuild 有一点了解,您可以使用一个复制步骤,将所有 dll 包含在一个文件夹中,并将您的依赖项移动到一个文件夹中,并从该文件夹中包含所有这些文件。