win32下调用Cygwin生成的dll老是不成功,最近终于找到一篇文章,里面说明了win32如何调用Cygwin生成的dll平台移植(Cygwin与Win32程序的交互)然后按照作者说的编译好了 CygLoad.dll
作者是用VB做的例子如下:Imports System.Runtime.InteropServicesFriend Class Program
    ' Nested Types
    Public Delegate Sub MainEntryMethod()
    ' Methods
    <DllImport("CygLoad.dll")> _
    Public Shared Sub CygwinStartUp(ByVal mainEntry As MainEntryMethod)
    End Sub    <STAThread()> _
    Friend Shared Sub Main()
        Program.CygwinStartUp(New Program.MainEntryMethod(AddressOf Program.MainEntry))
    End Sub    Friend Shared Sub MainEntry()Sub MainEntry()
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New MainForm())
    End Sub
End Class我修改到C#下public delegate void MainEntryMethod();
[DllImport("CygLoad.dll")]
public static extern void CygwinStartUp(MainEntryMethod mainEntry);[STAThread]
static void Main()
{
CygwinStartUp(new MainEntryMethod(ref MainEntry));
}public static void MainEntry()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
编译没问题,但是运行却弹不出Form1。无任何提示,请问是转换过程中出问题了吗?

解决方案 »

  1.   

     CygwinStartUp(new MainEntryMethod(ref MainEntry));
    这句话MainEntryMethod方法是不是要带命名空间?
      

  2.   

    检查一下Form1是不是设置什么属性了阿,在新建Form2,什么也不设置然后new Form2看看呢
      

  3.   

    从新添加了一个form2  啥都没动弹,new不出来啊, 泪流满面
      

  4.   

    F10跟进到 CygwinStartUp(new MainEntryMethod(ref MainEntry));
    这一句就不动了,提示如下:
    单步执行: 正在逐过程执行不含符号“System.MulticastDelegate.CtorOpened"的方法
      

  5.   

    VB.NET的例子可以运行不?
    另外这个不需要加ref,然后再带上命名空间,这样单步执行看提示信息是什么?
      

  6.   

    谢谢楼上回复:
    目前我改成这样
    CygwinStartUp(new MainEntryMethod(TestCygwin.Program.MainEntry));F10 提示
    TestCygwin.vshost.exe(托管) 已加载 “D:\TestCygwin\bin\debug\TestCygwin.exe",符号已加载。然后就没有反应了……
      

  7.   

    MainEntry方法有执行吗?另外VB.NET版本的可以成功执行吗?最好是先确定VB.NET可以成功运行,然后再研究C#的另外在DLL中CygwinStartUp方法中分别加上MessageBoxA弹出对话框,看DLL中程序的执行流程,是否有异常发生等.有什么对话框没出来等等.extern "C" void CygwinStartUp(void (*main)())
    {
    MessageBoxA(...)
        padding padding;
    MessageBoxA
        InitCygwin();
    MessageBoxA
        main();
    MessageBoxA
        FreeCygwin();
    MessageBoxA
    }
      

  8.   

    VB.NET的没测试过,不太熟悉vb呀  哎按照您的方法 padding padding;执行完就停住了。InitCygwin();没有执行,是这个cygLoad的问题啊Cygwin官方有篇文档,Loading cygwin1.dll from MinGW and MSVC
    可惜c不是很好,我先试试他们给出的例子看行不行吧
      

  9.   

    楼主能不能分享下你的Cgyload的源代码或dll,万分感激