none
WIN ARM OS下使用C# 讀取C建立DLL失敗 RRS feed

  • 問題

  • hi Advanced Members
    我在WIN ARM OS (WOA)使用C# 讀取C建立 DLL 失敗
    但同一套程式在Win x86 OS是可運行

    我試過
    1.C DLL 建立32/64/ARM
    2.C# 建立 x86/anyCPU
    3.DLL與C# exe放在一起
    //=================================================
    C#程式
    public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            CALL_DLL.Message();
        }
    }

    public class CALL_DLL
    {
        [DllImport("Test.dll")]
        public static extern void Message();
    }
    //=================================================
    C DLL
    DECLSPEC void __cdecl Message(void) {
    MessageBox(NULL, L"call DLL success", L"Test_DLL", MB_OK);

    }

    請問是否在WIN ARM下使用API會有不同呢?

    還是需要其他設定才能執行

    PS:用C++ call C DLL是在Win ARM os下是正常運作

    感謝


    Hans_TechNet


    • 已編輯 qh_ovo_hp 2020年6月15日 上午 06:24 說明有誤
    2020年6月13日 上午 02:51

所有回覆

  • 您欲呼叫的函式名稱為GRGBDLL_GetMEKBTYPE, 所以CALL_DLL類別應該這樣定義:

    public class CALL_DLL
     {
         [DllImport("Test.dll")]
         public static extern void GRGBDLL_GetMEKBTYPE();
     }

    2020年6月13日 上午 04:48
  • 點選 Details 按鈕,將訊息複製出來貼到記事本。

    裡面會告訴你哪一行出錯。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年6月14日 下午 02:31
  • sorry~

    是我key錯了~對他是要"GRGBDLL_GMEKBTYPE()才對但改回來後一樣無法讀取到DLL


    Hans_TechNet

    2020年6月15日 上午 06:23
  • 你的 dll 是指定用 arm 编译的吗?c# 也指定了 arm?如果你的 c# 是以 x86 虚拟机的方式运行的,那 dll 也要是 x86 32 才行。这二者必须一致。
    2020年6月15日 上午 06:56
  • 錯誤訊息是什麼?
    2020年6月15日 上午 07:01
  • 點選 Details 按鈕,將訊息複製出來貼到記事本。

    裡面會告訴你哪一行出錯。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    hi ~

    Details Message 如下:

    我看不出需要修改什麼,能麻煩你指導~

    //========================================

    See the end of this message for details on invoking 
    just-in-time (JIT) debugging instead of this dialog box.

    ************** Exception Text **************
    System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at WindowsFormsApp1.LibWrap.EIO_TEST_MESSAGE()
       at WindowsFormsApp1.Form1.button1_Click(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Loaded Assemblies **************
    mscorlib
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    WindowsFormsApp1
        Assembly Version: 1.0.0.0
        Win32 Version: 1.0.0.0
        CodeBase: file:///C:/Users/HCKTest/Desktop/New%20folder/Test/WindowsFormsAppx86.exe
    ----------------------------------------
    System.Windows.Forms
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Drawing
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System.Configuration
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Core
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    ----------------------------------------
    System.Xml
        Assembly Version: 4.0.0.0
        Win32 Version: 4.8.4084.0 built by: NET48REL1
        CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------

    ************** JIT Debugging **************
    To enable just-in-time (JIT) debugging, the .config file for this
    application or computer (machine.config) must have the
    jitDebugging value set in the system.windows.forms section.
    The application must also be compiled with debugging
    enabled.

    For example:

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    When JIT debugging is enabled, any unhandled exception
    will be sent to the JIT debugger registered on the computer
    rather than be handled by this dialog box.

    以上描述我能改什麼嗎?


    Hans_TechNet

    2020年6月16日 上午 01:44
  • 你的 dll 是指定用 arm 编译的吗?c# 也指定了 arm?如果你的 c# 是以 x86 虚拟机的方式运行的,那 dll 也要是 x86 32 才行。这二者必须一致。

    hi senior member

    good day
    我貼上C#編輯環境

    我對C#了解的不夠深~需要你們指導



    Hans_TechNet


    • 已編輯 qh_ovo_hp 2020年6月16日 上午 01:58
    2020年6月16日 上午 01:56
  • 你的 dll 是指定用 arm 编译的吗?c# 也指定了 arm?如果你的 c# 是以 x86 虚拟机的方式运行的,那 dll 也要是 x86 32 才行。这二者必须一致。

    DLL 編輯環境

    請問~同樣編輯X86下環境,使用在Win ARM OS 有需要設定什麼嗎?


    Hans_TechNet

    2020年6月16日 上午 02:01
  • 錯誤訊息是什麼?
    謝謝你協助~麻煩你看一下的回覆訊息

    Hans_TechNet

    2020年6月16日 上午 02:03
  • 我必需強調的

    同一套程式在Win x86 OS是可運行, 在WOA下是不能運行....


    Hans_TechNet

    2020年6月16日 上午 02:51
  • 第一步:请先建立一个不使用 dll 的项目测试一下,确保 .net WinForm 能在 WOA 下运行。不过目前看起来似乎不是这个问题。

    第二步:分别编译三个版本的 dll,也就是 X86、X64、ARM 这三个。然后逐一测试,因为你那个 .net 是 Any CPU,所以我也不知道 WOA 应该用哪一个,你把三个都试一遍看看,我认为不匹配可能就是你这个问题的原因。

    • 已編輯 [-] 2020年6月16日 上午 06:50
    2020年6月16日 上午 06:45
  • 第一步:请先建立一个不使用 dll 的项目测试一下,确保 .net WinForm 能在 WOA 下运行。不过目前看起来似乎不是这个问题。

    第二步:分别编译三个版本的 dll,也就是 X86、X64、ARM 这三个。然后逐一测试,因为你那个 .net 是 Any CPU,所以我也不知道 WOA 应该用哪一个,你把三个都试一遍看看,我认为不匹配可能就是你这个问题的原因。

    hi i 感謝你的回覆:

    我驗證步驟如同你說明的~我也在C#指定AnyCPU and 指定X86產生這兩個exe,分別驗證C/C++ DLL X86 and x64、ARM(沒有ARM64),階不能讀取。

    我利用了

    try
                        {
                            AssemblyName an = AssemblyName.GetAssemblyName(fn);
                            Console.WriteLine("Assembly: {0}", an.Name);
                            if (an.ProcessorArchitecture == ProcessorArchitecture.MSIL)
                                Console.WriteLine("Architecture: AnyCPU");
                            else
                                Console.WriteLine("Architecture: {0}", an.ProcessorArchitecture);
    
                            Console.WriteLine();
                        }

    來別辨C#在ARM下使用的環境是X86如圖DLL 也是X86

    結果還是無法正確讀取

    thanks


    Hans_TechNet

    2020年6月16日 上午 07:49
  • 我看到你的 dll 中指定使用 __cdecl,但 c# 中没有任何指定。我查了一下发现 CallingConvention 默认为 Winapi(https://docs.microsoft.com/zh-tw/dotnet/api/system.runtime.interopservices.dllimportattribute.callingconvention),这样在不同的平台下可能会不同,请用 CallingConvention = CallingConvention.Cdecl 试一下。

    另外测试时请使用空 Message 函数进行测试,以便排除是函数内容导致的问题。

    由于我没有 arm 环境,所以需要你自己多测试一下,应该不是什么大问题,如果 Processor Architecture 没有问题的话,很可能就是那些参数有什么地方不太对。

    2020年6月16日 上午 10:17
  • ************** Exception Text **************

    System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at WindowsFormsApp1.LibWrap.EIO_TEST_MESSAGE()
       at WindowsFormsApp1.Form1.button1_Click(Object sender, EventArgs e)
      
    如果 EIO_TEST_MESSAGE 是你 DLL 內的函數,這表示已經進入到 DLL 後才發生錯誤。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年6月16日 上午 11:25
  • ************** Exception Text **************

    System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at WindowsFormsApp1.LibWrap.EIO_TEST_MESSAGE()
       at WindowsFormsApp1.Form1.button1_Click(Object sender, EventArgs e)
      

    如果 EIO_TEST_MESSAGE 是你 DLL 內的函數,這表示已經進入到 DLL 後才發生錯誤。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    EIO_TEST_MESSAGE 应该不是 dll 中的函数,因为命名空间是 WindowsFormsApp1.LibWrap,所以这个应该是 c# 中的那个 public static extern ... 函数。dll 中的函数不会有这样的命名空间,另外错误报告中的名称应该是编译后的名称,依据命名规则 __cdecl 函数的名称应该是“_ + 原函数名”。

    最上面的代码应该编辑过,那段代码中的函数是 CALL_DLL.Message,和这个对应的错误报告中的内容应该是 WindowsFormsApp1.CALL_DLL.Message()。

    • 已編輯 [-] 2020年6月16日 下午 04:14
    2020年6月16日 下午 04:07
  • EIO_TEST_MESSAGE 应该不是 dll 中的函数,因为命名空间是 WindowsFormsApp1.LibWrap,所以这个应该是 c# 中的那个 public static extern ... 函数。dll 中的函数不会有这样的命名空间,另外错误报告中的名称应该是编译后的名称,依据命名规则 __cdecl 函数的名称应该是“_ + 原函数名”。

    最上面的代码应该编辑过,那段代码中的函数是 CALL_DLL.Message,和这个对应的错误报告中的内容应该是 WindowsFormsApp1.CALL_DLL.Message()。

    Sorry~

        為防止誤會我將Code放上來

    DLL

    DECLSPEC int __cdecl EIO_TEST_MESSAGE()
    {
    	return 33;
    }

    C#

    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                int test = LibWrap.EIO_TEST_MESSAGE();
                MessageBox.Show(test.ToString());
            }
        }
    
        public class LibWrap
        {
            //[DllImport("ECSio.dll")]
            [DllImport("ECSio.dll", CharSet = CharSet.Unicode,
            CallingConvention = CallingConvention.Cdecl)]
            public static extern int EIO_TEST_MESSAGE();
        }
    }

    如同上面疑問"EIO_TEST_MESSAGE"是DLL函式

    是的~它是進了DLL後所產的Error

    同一套程式在Win x86 OS是可運行, 在WOA下是不能運行....

    有確認都是用x86來運行


    Hans_TechNet


    • 已編輯 qh_ovo_hp 2020年6月17日 上午 07:55
    2020年6月17日 上午 07:52
  • 我看到你的 dll 中指定使用 __cdecl,但 c# 中没有任何指定。我查了一下发现 CallingConvention 默认为 Winapi(https://docs.microsoft.com/zh-tw/dotnet/api/system.runtime.interopservices.dllimportattribute.callingconvention),这样在不同的平台下可能会不同,请用 CallingConvention = CallingConvention.Cdecl 试一下。

    另外测试时请使用空 Message 函数进行测试,以便排除是函数内容导致的问题。

    由于我没有 arm 环境,所以需要你自己多测试一下,应该不是什么大问题,如果 Processor Architecture 没有问题的话,很可能就是那些参数有什么地方不太对。

    HI 感謝你提供寶貴的建議~

    但還是不行

    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                int test = LibWrap.EIO_TEST_MESSAGE();
                MessageBox.Show(test.ToString());
            }
        }
    
        public class LibWrap
        {
            //[DllImport("ECSio.dll")]
            [DllImport("ECSio.dll", CharSet = CharSet.Unicode,
            CallingConvention = CallingConvention.Cdecl)]
            public static extern int EIO_TEST_MESSAGE();
        }
    }


    Hans_TechNet

    2020年6月17日 上午 07:54
  • BadImageFormat錯誤表示您的程式和欲使用的DLL格式不一樣, 例如:

    1) 您的程式為64bit, DLL為32bit

    2) 您的程式為32bit, DLL為64bit

    2020年6月17日 上午 08:04
  • 理论上出现 BadImageFormatException 这个错误表示 exe 和 dll 之间的 Processor Architecture 不匹配(https://docs.microsoft.com/zh-tw/dotnet/api/system.badimageformatexception)。但你说你确定是一致的,所以建议你试一下其他设置,如果你试过之后都不行,而且没有看到 _EIO_TEST_MESSAGE 这个函数名(这是 __cdecl 编译后的名称),那看来还是 dll 没有正确载入。

    第一步:在 c# 中添加 Environment.Is64BitProcess 这个 api,在运行时确认一下究竟是不是 X86。

    第二步:不要调用你自己的 dll,而是用 p/invoke 方法随便调用任何一个 windows api 试一下,如果连调用 windows 自身的 dll 都不行那就说明不支持这种方式或者你的 c# 程序有什么地方需要设置。

    2020年6月17日 上午 11:17
  • HI Advanced Members

    找到原因了~昨天找了一天, 終於知道為何不能在ARM下執行了
    原因:

    因為先前參考某某網路上建議C#讀取DLL方式將Runtime Support改為/clr
    而造成在ARM無法運作問題,現在改回來"No Common Language Runtime Support"就正常

    感謝前輩的寶貴建議

    再次感謝前輩們肯發時間為我解答

    謝謝


    Hans_TechNet

    2020年6月19日 上午 02:14
  • hi this 

    感謝你



    Hans_TechNet

    2020年6月19日 上午 02:15
  • hi [-]

    感謝



    Hans_TechNet

    2020年6月19日 上午 02:16
  • hi 心冷熱情熄

    i 心冷熱情熄

    感謝



    Hans_TechNet

    2020年6月19日 上午 02:16