none
C#2010連結VC 2010編譯完成的DLL檔 在win7可以跑 XP卻會出現記憶體已損毀? RRS feed

  • 問題

  • 大家好

    我的開發環境為VS2010 在VC2010上寫好一個DLL檔後要丟給C#2010使用

    在win7上都沒有問題 C#程式碼編譯完後執行都可以跑出正確結果

    將全部程式碼搬到XP SP3(一樣都是安裝VS2010) 重新編譯執行C#程式碼 執行到外部DLL檔時都會出現

    "嘗試讀取或寫入受保護的記憶體 這通常表示其他記憶體已損毀"

    我在XP底下有做一些嘗試 在XP底下重新編譯DLL檔 都是一樣結果

    我有換過幾台電腦嘗試(win7 32bit*3  win xp 32bit*3) 全部都是安裝VS2010

    但是3台win7都OK 3台XP都出現同樣錯誤

    不知道XP跟win7在使用VS2010上有啥不同之處嗎

    以下附上C#部分用來接DLL檔的程式碼

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    namespace WindowsFormsApplication1
    {
        public class Newton
        {
            // dimension
            protected static int _n;
            // goal function
            public delegate void GoalFunc(double[] input, double[] output);
            protected static GoalFunc _goalfunc;
            // delegate of api warper
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            public delegate void API_Warper(IntPtr input, IntPtr output);
            // warper implement
            protected static void Warper(IntPtr input, IntPtr output)
            {
                double[] i = new double[_n], o = new double[_n];
                // copy value into c# array
                Marshal.Copy(input, i, 0, _n);
                Marshal.Copy(output, o, 0, _n);
                // goal function
                _goalfunc(i, o);
                // copy back to c array
                Marshal.Copy(i, 0, input, _n);
                Marshal.Copy(o, 0, output, _n);
            }
            // newton method in c dll
            [System.Runtime.InteropServices.DllImport("numerdll.dll", EntryPoint = "mnewt_export", CallingConvention = CallingConvention.Cdecl, SetLastError = true,
                ExactSpelling = false )]
            protected static extern void mnewt( 
                [MarshalAs(UnmanagedType.FunctionPtr)]API_Warper f, 
                int ntrial, double[] x, int size, double tolx, double tolf );
            
            // algorithm entry
            public static void Compute(GoalFunc func, int ntrial,  double[] x, double tolx, double tolf)
          
            {
                _n = x.Count(); // dimension
                _goalfunc = func;  // goal function
                try
                {
                    mnewt(Warper, ntrial, x, _n, tolx, tolf);   // newton method   <<<<<<<<<<------------這行會出錯
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("發散!");
                }
            }
        }
    }


    • 已編輯 楷倫 2012年5月29日 上午 06:22
    2012年5月29日 上午 06:20

解答

  • 想到另一件事...

    .Net Managed dll 沒有 dll hell ,但是 COM DLL、 Function DLL 仍然有 DLL Hell 問題,所以降轉有問題就變正常了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月7日 下午 12:53

所有回覆

  • 您好,以下資訊給您參考一下,希望對您有幫助,謝謝!

    C#透過DllImport第三方DLL時記憶體損毀例外

    C#调用具有指针返回值的C函数时,触发AccessViolationException异常的问题


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2012年5月29日 上午 06:55
    2012年5月29日 上午 06:53
  • 你可以需要找 numerdll.dll 的開發商才能準確知道問題所在和解決它。

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年5月29日 上午 07:38
  • 你可以需要找 numerdll.dll 的開發商才能準確知道問題所在和解決它。

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    謝謝兩位 那2篇文章我有看過 有嘗試修改 還有加上ref

    結果一樣

    而且我不懂的是win7都可以跑 xp卻都不行

    那個dll檔是我請人改寫的 請他幫我把c++ source code包成DLL檔 我也有source code

    只是不會改 可能還要在研究一下

    2012年5月29日 上午 09:35
  • 您好,
    請問有在xp上重新Build VC的專案嗎?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年5月29日 上午 10:30
  • 您好,
    請問有在xp上重新Build VC的專案嗎?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    有喔 我XP的電腦也都是安裝VS2010

    DLL檔和C#程式碼我都有重複編譯過 測試過好幾次...但是在XP編譯完執行到那個部份就是會出錯

    然後把XP編譯好的檔丟回win7就一樣可以跑...orz

    請問XP跟VS2010是有不相容嗎?或者少安裝到什麼東西嗎? 試了3台XP的電腦都這樣...


    2012年5月29日 下午 02:42
  • 如果您在xp機器上,Debug,在 Call mnewt 就發生錯誤了嗎?

    還是進mnewt函式中的某一行呢?

    或許能Trace進去看看!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年5月30日 上午 01:08
  • 剛剛有試了一下 XP是call mnewt時就直接發生記憶體已損毀

    win7可以順利trace進去dll檔跑完

    所以應該是C#接DLL的部分沒寫好的樣子 但是不知道再來該怎麼處理@@

    2012年5月30日 上午 06:51
  • 您好,

    是否能將 C++ 的Code Po出來給大家參考一下嗎?

    應該是宣告在XP的問題吧!

    以下的資訊給您參考,希望對您有幫助,謝謝!

    在c#里调用C++的dll时,需要注意的一些问题 

    关于P/Invoke和AccessViolationException

    C SendMessage引发的 尝试读取或写入受保 详细»

    Passing Arrays to DLL 'System.AccessViolationException'


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年5月30日 下午 02:32
  • 謝謝您提供的資料

    我剛剛同時用XP和win7 分別trace進去DLL source code

    已經找出問題點 也修改好c++source code部分 在XP上面已經可以跑了

    但是不知道為何WIN7可以那樣寫 XP不行 這部分也不是我自己做的

    明天在把程式碼PO上來給各位前輩看看 3Q

    2012年5月30日 下午 03:00
  • 先把 DEP 關掉,如果沒問題,視為 bug  ,丟回去給開發商處理。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年5月30日 下午 03:19
  • 謝謝您提供的資料

    我剛剛同時用XP和win7 分別trace進去DLL source code

    已經找出問題點 也修改好c++source code部分 在XP上面已經可以跑了

    但是不知道為何WIN7可以那樣寫 XP不行 這部分也不是我自己做的

    明天在把程式碼PO上來給各位前輩看看 3Q

    To 楷倫:

    今天已經六月七日了, 不曉得這問題目前處理的如何 ? 請記得回覆


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月7日 下午 12:15
    版主
  • 想到另一件事...

    .Net Managed dll 沒有 dll hell ,但是 COM DLL、 Function DLL 仍然有 DLL Hell 問題,所以降轉有問題就變正常了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月7日 下午 12:53