2025年7月1日 星期二

簽署時發生錯誤: 無法簽署 bin\Debug\app.publish\XXX.exe。SignTool Error: No certificates were found that met all the given criteria.

 這是一個程式碼簽署憑證的問題。當您的專案設定要進行程式碼簽署,但系統找不到合適的憑證時就會出現這個錯誤。以下是幾種解決方法:

方法 1:移除程式碼簽署設定

如果您不需要程式碼簽署,可以在專案中移除相關設定:

  1. 在 Visual Studio 中右鍵點擊專案 → 屬性
  2. 點擊「簽署」頁籤
  3. 取消勾選「簽署 ClickOnce 資訊清單」
  4. 取消勾選「簽署組件」
  5. 儲存並重新建置

方法 2:修改專案檔案

直接編輯 .csproj.vbproj 檔案:

xml
<!-- 移除或註解掉這些行 -->
<!--
<SignManifests>true</SignManifests>
<ManifestCertificateThumbprint>...</ManifestCertificateThumbprint>
<ManifestKeyFile>...</ManifestKeyFile>
-->

<!-- 或者設定為 false -->
<SignManifests>false</SignManifests>
<SignAssembly>false</SignAssembly>

方法 3:建立測試憑證(用於開發環境)

如果您需要程式碼簽署功能:

  1. 在 Visual Studio 中:
    • 專案屬性 → 簽署
    • 點擊「建立測試憑證」
    • 設定密碼(可留空)
    • 點擊「確定」
  2. 或使用命令列建立:
cmd
makecert -r -pe -n "CN=YourCompany" -ss My -sky signature -a sha256 -len 2048 testcert.cer

方法 4:安裝現有憑證

如果您有憑證檔案:

  1. 雙擊 .pfx.p12 憑證檔案
  2. 選擇「目前使用者」或「本機電腦」
  3. 輸入憑證密碼
  4. 選擇「根據憑證類型自動選取憑證存放區」
  5. 完成安裝

方法 5:使用 PowerShell 檢查憑證

檢查系統中可用的憑證:

powershell
# 列出所有個人憑證
Get-ChildItem -Path "Cert:\CurrentUser\My"

# 列出具有程式碼簽署用途的憑證
Get-ChildItem -Path "Cert:\CurrentUser\My" -CodeSigningCert

方法 6:針對 Jenkins 或 CI/CD 環境

如果是在自動化建置環境中:

  1. 在建置腳本中加入:
xml
<PropertyGroup>
  <SignManifests>false</SignManifests>
  <SignAssembly>false</SignAssembly>
</PropertyGroup>
  1. 或在 MSBuild 命令中加入參數:
cmd
msbuild YourProject.csproj /p:SignManifests=false /p:SignAssembly=false

建議做法

開發環境:

  • 通常不需要程式碼簽署,建議使用方法 1 或 2

測試環境:

  • 可以使用測試憑證(方法 3)

正式環境:

  • 使用正式的程式碼簽署憑證(方法 4)

2024年2月6日 星期二

MS-SQL查詢指定資料表的結構

如果今天要修改一個欄位的長度,再來查查看是否有修改成功

 1.

MS Sql

修改欄位語法
ALTER TABLE MyTable ALTER Column Column_1 nvarchar(10) NOT NULL

2.

方法1

-- 查詢指定資料表的結構
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable ';

方法2

-- 查詢指定資料表的結構
EXEC sp_columns 'MyTable ';

2024年2月1日 星期四

主控台程式(console)關閉事件

 原始的console是沒有這種好東西的.於是我們想要在關閉視窗之後再來抓到這個關閉事件

就要自行加工處理了,直接上程式碼,在program.cs上

 internal class Program
    {
        #region 激活關閉視窗事件
        public delegate bool ControlCtrlDelegate(int CtrlType);
        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerAppClose, bool Add);
        private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerAppClose);

        /// <summary>
        /// 關閉視窗時的事件
        /// </summary>
        /// <param name="CtrlType"></param>
        /// <returns></returns>
        private static bool HandlerAppClose(int CtrlType)
        {
            logger.Debug("HandlerAppClose:控制台關閉中...:" + DateTime.Now.ToString());
            return false;
        }

        #endregion
        public static log4net.ILog logger = log4net.LogManager.GetLogger("ConSoleLog");//取得一個日誌記錄
        static void Main(string[] args)
        {
            logger.Debug("SetConsoleCtrlHandler:" + DateTime.Now.ToString());
            ////註冊視窗關閉事件
            bool bRet = SetConsoleCtrlHandler(cancelHandler, true);           
            while (true)
            {
                Console.WriteLine("主程式執行!");
                Console.ReadLine();
                Thread.Sleep(1000);

            };
        }
    } 

 實際運行時.如果拿掉Console.ReadLine()Thread.Sleep(1000) 這兩行很多時候會無法跑到

關閉的事件裡



 

2024年1月30日 星期二

log4net 無法產出log文字檔

 平常在專案時常使用log4net來記錄log,但這次寫了一個console的程式卻發現無法產出log檔連

console 也沒有任何的資訊...

以下是解決方法

 1.先在 AssemblyInfo.cs的這支程式加入

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

 

 2.在app.config上加入

 <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections> 

 

接下來再加入 

 <log4net>

    <!--輸出到Console-->
    <appender name="A1" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %logger - %message%newline" />
      </layout>
    </appender>

    <!-- 輸出到檔案 -->
    <appender name="A2" type="log4net.Appender.RollingFileAppender">
      <file value="D:/log/FE_Check_II/" />
      <!-- 輸出檔名 -->
      <staticLogFileName value="false" />
      <appendToFile value="true" />
      <encoding value="utf-8" />
      <rollingStyle value="Date" />
      <datePattern value="yyyy-MM-dd.'TXT'" />
      <!-- <rollingStyle value="Composite" /> -->
      <maximumFileSize value="10MB" />
      <!-- 每個檔案最大size -->
      <maxSizeRollBackups value="-1" />
      <!-- <rollingStyle value="Date" /> -->
      <!-- <datePattern value="yyyyMMdd" /> -->
      <layout type="log4net.Layout.PatternLayout">
        <!-- <conversionPattern value="%date %level %logger (%file:%line) - %message%newline" /> -->
        <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <root>
      <!-- 輸出訊息等級 -->
      <level value="DEBUG" />
      <appender-ref ref="A1" />
      <appender-ref ref="A2" />
    </root>
  </log4net>

3.在Program.cs

加入

public static log4net.ILog logger = log4net.LogManager.GetLogger("ProgramLog");//取得一個日誌記錄

 

 再來只要 

logger.Debug("您要顯示的訊息");

成功搞定產出log文字檔

 

 

簽署時發生錯誤: 無法簽署 bin\Debug\app.publish\XXX.exe。SignTool Error: No certificates were found that met all the given criteria.

 這是一個程式碼簽署憑證的問題。當您的專案設定要進行程式碼簽署,但系統找不到合適的憑證時就會出現這個錯誤。以下是幾種解決方法: 方法 1:移除程式碼簽署設定 如果您不需要程式碼簽署,可以在專案中移除相關設定: 在 Visual Studio 中右鍵點擊專案 → 屬性 點擊「...