none
關於 C# 使用 dll 檔案路徑錯誤問題 RRS feed

  • 問題

  • 各位先進好:

     

    我有一個 VC6 寫的 dll,目的用來檢查檔案是否存在,並且使用相對路徑,也就是 Data.txt 必須跟這個 dll 檔在同一個目錄

    int CheckFile()

    {

    FILE *fp = fopen(".\\Data.txt","r");

    if(fp==NULL)

    return 0;

    else

    return 1;

    }

     

    而我在 VB.NET 2005 中呼叫這個dll 的CheckFile函數

    Private Declare Function CheckFile Lib "Test.dll" () As Integer

    沒有問題,若檔案存在傳回1,不存在傳回0

     

    但是用 C# 2005 就會出現問題

    [DllImport("Test.dll")]
    public static extern int CheckFile();

     

    無論 Data.txt 是否跟 Test.dll 在同一個目錄下

    都只會傳回 0

     

    請問這是什麼原因?

     

    謝謝各位先進

    2008年7月18日 上午 07:21

解答

  • 開檔若未指定路徑,基本上是在工作路徑查找,非 dll 或應用程式路徑。

     

    正確觀念是應該使用全路徑。

     

    但若有此需求,可確認該應用程式目前的工作路徑是啥,來決定是否能正確開啟或輸出檔案。例如新開 C# 專案,工作路徑會在 xxx/project/project/bin/debug 下 (IDE 開發環境),而大部分慣例會以為在 xxx/project/project 下 (散佈後安裝的狀態,預設工作路徑等同於應用程式路徑,但非絕對)。

     

    所以請確認執行時的工作路徑。

     

    dll 是被引用到執行檔內的,dll 自己也不知道它被存在哪,除非透過 Process 列舉 Moudle ,才會得到 dll 的存放路徑,所以你的程式指定要存取 dll 路徑的觀念,本身就有問題。

    2008年7月20日 上午 09:06

所有回覆

  • HI,

     

    C#或VB.NET程式要判斷檔案是否存在, 可以呼叫File類別的Exists方法即可, 不需要呼叫VC6的DLL, 如果真的要呼叫, 您可以考慮將VC6的DLL做成這樣:

     

    int CheckFile(char *Filename)

    {

    FILE *fp = fopen(Filename","r");

    if(fp==NULL)

    return 0;

    else

    return 1;

    }

     

    讓C#或VB.NET程式傳入檔案, 就不會有您提到的問題了, 而成CheckFile也會變的比較通用, 因為不是只能判斷data.txt是否存在而已

     

    tihs

    2008年7月19日 上午 08:38
  • this 您好

     

    感謝您的回答

     

    這個 dll 只是我用來練習的例子

    改成您建議的方式確實解決了我的問題

    謝謝

     

     

    只是很好奇 用  VC6 製作的 dll 裡面包含檔案路徑

     

    分別用 VB.NET 跟 C# 以 API 的方式來呼叫,竟然會有不同的結果

    不知道為麼會這樣?

     

    是不是 C# 在使用 dll 檔ㄉ時候會先複製一份到某個目錄,照成 dll 檔中使用相對路徑發生找不到檔案的情形

     

    謝謝

     

    2008年7月19日 下午 03:33
  • 開檔若未指定路徑,基本上是在工作路徑查找,非 dll 或應用程式路徑。

     

    正確觀念是應該使用全路徑。

     

    但若有此需求,可確認該應用程式目前的工作路徑是啥,來決定是否能正確開啟或輸出檔案。例如新開 C# 專案,工作路徑會在 xxx/project/project/bin/debug 下 (IDE 開發環境),而大部分慣例會以為在 xxx/project/project 下 (散佈後安裝的狀態,預設工作路徑等同於應用程式路徑,但非絕對)。

     

    所以請確認執行時的工作路徑。

     

    dll 是被引用到執行檔內的,dll 自己也不知道它被存在哪,除非透過 Process 列舉 Moudle ,才會得到 dll 的存放路徑,所以你的程式指定要存取 dll 路徑的觀念,本身就有問題。

    2008年7月20日 上午 09:06
  • Dear 璉璉

     

    謝謝您的指導

    更正了我的觀念

     

    也謝謝 this 大哥非常快速的回覆及提醒

    2008年7月21日 上午 01:21