65.9K
CodeProject 正在变化。 阅读更多。
Home

DotNetNuke 模块打包(针对终端用户)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年5月14日

CPOL

6分钟阅读

viewsIcon

24492

如何创建一个模块包,而无需泄露您的源代码。

引言

您已经接触 DNN 模块一段时间了,现在您编写了一些您想出售的东西。但您不想泄露您的源代码——该怎么办?

如果您仔细看过,您可能会遇到 Michael Washington 关于如何将 DNN 模块打包为已编译程序集的文章。这是一篇很棒的文章,但有一个缺点:如果您是一个穷困潦倒的开发者,使用 Visual Web Developer Express(因为它免费,太棒了!),这将不起作用。

如果您为此问题一直在默默哭泣,请不要再绝望了,有一个解决方案(感谢 jamesche 的 关于在 VWD Express 中使用 aspnet_compiler 的精彩文章)。

这些关于这个主题的思考将这两篇文章结合起来,并填补了缺失的部分……

步骤 1:创建外部工具

这与 jamesche 的文章中所述的大致相同。在 VWD 中启动您的 DNN 网站,然后选择“工具”->“外部工具”。您将看到外部工具创建窗口。现在

  1. 输入“预编译(DNN)”作为标题。
  2. 单击“命令”文本框旁边的省略号,导航到 c:\Windows\Microsoft.NET\Framework\v2.0.50727,然后选择 aspnet_compiler.exe
  3. 在“参数”文本框中,输入以下字符串:-p "$(ProjectDir)" -v / "$(ProjectDir)\..\CompiledDNNSite" -u -fixednames
  4. 如果您复制并粘贴了上面的参数字符串,请仔细检查双引号是否未被转换为智能引号。事实上,最好还是手动输入该字符串。通过单击文本框右侧的箭头并从弹出菜单中选择“项目目录”,可以正确插入 $(ProjectDir)
  5. 如果您希望命令提示符在完成预编译后自动关闭,请勾选“退出时关闭”复选框。

如果您查看了 jamesche 关于设置编译器的原始说明,您会注意到(因为您一直在关注)我添加了两个选项,-u-fixednames。简单解释一下:-u 确保您的 .ascx 文件不包含在编译后的包中。它们仅更新为引用代码隐藏文件的已编译版本。到目前为止,我看到的所有 DNN 模块都保留了 .ascx 文件,以便客户可以编辑它们来调整模块的外观——这也很合理。-fixenames 选项确保每个页面都有自己的程序集。删除该选项,您将不知道哪些 DLL 是您的,哪些不是。来吧,我敢打赌,您可以尝试省略 -u-fixednames。您会看到的……

现在您应该有一个名为(毫不奇怪)“预编译(DNN)”的外部工具。运行它,您的已编译 DNN 网站将出现在一个名为 CompiledDNNSite 的目录中,该目录应与您的未编译 DNN 网站具有相同的根目录。我相信您会找到它的。如果您查看 /bin 文件夹,您将看到所有您梦寐以求的 DLL……

步骤 2:创建源代码模块包

好吧,您不妨利用 DNN 的自动模块打包功能。转到“主机”->“模块定义”,然后点击您想销售的模块左侧的可爱小铅笔。您将看到所有模块包信息。(我假设您知道模块入门工具包中的小功能,它在前两个框中放入了略有错误的模块和文件夹名称。只需用正确的值替换它们,这很明显。)在页面底部,有一个标签为“创建模块包”的链接。点击它,使用默认的 zip 文件名(除非您不喜欢它,那样的话,请随意发挥……)。勾选“创建清单文件?”复选框,然后点击“创建”。您应该会在 DNN 网站的“Install\Module”文件夹中找到该模块。

您现在拥有一个源代码模块包。如果我是您,我会测试它以确保它可以正常安装。否则,在创建已编译模块包后查找错误的流程将是漫长而痛苦的,就像一只患有多种椎间盘突出的python。

步骤 3:用已编译的程序集替换源代码文件

一旦您确定模块包运行正常,请将其解压缩(解压缩到一个不包含在您的 DNN 网站内的文件夹;否则,如果您出于某种原因需要重新编译,您将获得重复的 DLL!)。

记下所有与代码相关的文件(.cs、.vb.config.ascx)(如果您使用 DataSet,则还有 .xsd.xss!)。

ASP.NET 编译器创建了一堆已编译的程序集,但不幸的是,没有任何线索可以表明 DNN 网站的原始结构。所有东西都混杂在 /bin 文件夹中。所以,您需要弄清楚。首先,简单部分,.ascx 文件。因为我们将它们排除在已编译的程序集之外,所以它们没有放在 /bin 目录中,而是放在相关的 DesktopModules 文件夹中。因此,如果您的模块的源代码在名为“MyWonderfulModule”的文件夹中,那么您现在应该在 CompiledDNNSite\DesktopModules\MyWonderfulModule 中找到所需的 .ascx 文件。从您的解压缩的存档中删除原始 .ascx 文件,并用已编译网站中的文件替换它们。

接下来,您需要找到所有对应于您的模块代码隐藏文件的 DLL。它们的名称将类似于 App_Web_viewprofile.ascx.390b2b.dll。来自 DesktopModules 目录的所有已编译代码都以 App_Web 开头,这很有帮助,但是……

查看那些以 App_Web_Settings 开头的长长的 DLL 列表。每个具有 Settings.ascx 文件的模块都对应一个,无论它们是您的还是别人的。幸运的是,有一个小技巧可以利用。希望您的模块至少有一个名称完全独特.ascx 文件,例如 ViewMyWonderfulModule.ascx。您应该在 CompiledDNNSite\bin 目录中有一个(且只有一个)对应的 DLL,类似于 App_Web_ViewMyWonderfulModule.ascx.123xyz.dll

这里的诀窍是:从您的 DesktopModules/MyWonderfulModule 文件夹编译的所有文件将具有相同的代码编号。所以复制它,让烦人的回形针做点有用的事情——搜索包含该字符串的文件名。

Search for filenames containing the code

这应该会给您一个您需要的 DLL 列表。(好吧,我在这里使用的示例模块没有设置控件,但您懂了……)

Results

只需选择所有文件并将它们移动到您解压缩的模块包中。每个代码隐藏文件(.cs.vb)都应该有一个。仔细检查,然后删除原始源代码文件。

好的,现在是 DAL 代码。这其实很简单。所有 DAL 代码,包括 DataSet,都应该被编译成一个 DLL,以 App_SubCode 开头,例如 App_SubCode_MyWonderfulModule.dll。将此文件添加到您的文件夹中,您应该在需要的地方拥有所有已编译的代码。

最后,您需要删除任何可能混入的 .config 文件。现在,您应该拥有所有需要的文件,但仍然需要告知 DNN 它们的存在。

步骤 4:更新清单文件

打开模块安装包中的 .dnn 文件,向下滚动到构成模块的文件列表。此列表仍然引用您已删除的 .cs.vb.config 文件,因此必须更新……

清单文件列出了构成已完成模块的所有文件,这些文件包含在 <file>...</file> 标签中。只需删除所有对您已删除文件的引用,并添加对您已添加文件的引用。就是这么简单。

以前

<files>
    <file>
      <path>App_LocalResources</path>
      <name>EditTaskList.ascx.resx</name>
    </file>
    <file>
      <path>App_LocalResources</path>
      <name>Settings.ascx.resx</name>
    </file>
    <file>
      <path>App_LocalResources</path>
      <name>ViewTaskList.ascx.resx</name>
    </file>
    <file>
      <name>01.00.00.SqlDataProvider</name>
    </file>
    <file>
      <name>EditTaskList.ascx</name>
    </file>
    <file>
      <name>EditTaskList.ascx.cs</name>
    </file>
    <file>
      <name>module.css</name>
    </file>
    <file>
      <name>Uninstall.SqlDataProvider</name>
    </file>
    <file>
      <name>ViewTaskList.ascx</name>
    </file>
    <file>
      <name>ViewTaskList.ascx.cs</name>
    </file>
    <file>
      <path>[app_code]</path>
      <name>DataProvider.cs</name>
    </file>
    <file>
      <path>[app_code]</path>
      <name>SqlDataProvider.cs</name>
    </file>
    <file>
      <path>[app_code]</path>
      <name>TaskDataSet.xsd</name>
    </file>
    <file>
      <path>[app_code]</path>
      <name>TaskDataSet.xss</name>
    </file>
    <file>
      <path>[app_code]</path>
      <name>TaskListController.cs</name>
    </file>
</files>

操作后

<files>
    <file>
      <path>App_LocalResources</path>
      <name>EditTaskList.ascx.resx</name>
    </file>
    <file>
      <path>App_LocalResources</path>
      <name>Settings.ascx.resx</name>
    </file>
    <file>
      <path>App_LocalResources</path>
      <name>ViewTaskList.ascx.resx</name>
    </file>
    <file>
      <name>01.00.00.SqlDataProvider</name>
    </file>
    <file>
      <name>EditTaskList.ascx</name>
    </file>
    <file>
      <name>App_Web_edittasklist.ascx.ee0a509f.dll</name>
    </file>
    <file>
      <name>module.css</name>
    </file>
    <file>
      <name>Uninstall.SqlDataProvider</name>
    </file>
    <file>
      <name>ViewTaskList.ascx</name>
    </file>
    <file>
      <name>App_Web_viewtasklist.ascx.ee0a509f.dll</name>
    </file>
    <file>
      <name>App_SubCode_TaskList.dll</name>
    </file>
</files>

就这样!您完成了!去卖您的模块吧!

© . All rights reserved.