将cygwin1.dll加载到C#-访问冲突错误 我想把CygWin编译的一些C++ DLL加载到我的C项目(4.7.1或标准2),第一步当然是加载 CygWiN1.DLL。但我一直坚持这一步。正如建议的那样,我尝试了以下方法: [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32", SetLastError = true)] static extern IntPtr LoadLibrary(string lpFileName); static void Main(string[] args) { IntPtr pcygwin = LoadLibrary("cygwin1.dll"); IntPtr pcyginit = GetProcAddress(pcygwin, "cygwin_dll_init"); Action init = (Action)Marshal.GetDelegateForFunctionPointer(pcyginit, typeof(Action)); init();// Here the error happens } typedef void (*an_action)(); HMODULE h_cygwin; bool initialize() { h_cygwin = LoadLibrary(TEXT("cygwin1.dll")); if (h_cygwin == nullptr) return false; auto cygwin_dll_init = (an_action) GetProcAddress(h_cygwin, "cygwin_dll_init"); if (cygwin_dll_init == nullptr) return false; cygwin_dll_init(); return true; }

将cygwin1.dll加载到C#-访问冲突错误 我想把CygWin编译的一些C++ DLL加载到我的C项目(4.7.1或标准2),第一步当然是加载 CygWiN1.DLL。但我一直坚持这一步。正如建议的那样,我尝试了以下方法: [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32", SetLastError = true)] static extern IntPtr LoadLibrary(string lpFileName); static void Main(string[] args) { IntPtr pcygwin = LoadLibrary("cygwin1.dll"); IntPtr pcyginit = GetProcAddress(pcygwin, "cygwin_dll_init"); Action init = (Action)Marshal.GetDelegateForFunctionPointer(pcyginit, typeof(Action)); init();// Here the error happens } typedef void (*an_action)(); HMODULE h_cygwin; bool initialize() { h_cygwin = LoadLibrary(TEXT("cygwin1.dll")); if (h_cygwin == nullptr) return false; auto cygwin_dll_init = (an_action) GetProcAddress(h_cygwin, "cygwin_dll_init"); if (cygwin_dll_init == nullptr) return false; cygwin_dll_init(); return true; },c#,cygwin,C#,Cygwin,但是没有运气。应用程序崩溃,VS输出显示“访问冲突”错误。它发生在最后一行(init();) 然后在简单C++控制台应用程序中(在上面引用的同一页中找到): 我还创建了一个def文件,用于导出函数并将新的dll加载到我的C#project中。但当到达cygwin\u dll\u init()时,我再次遇到访问冲突崩溃。奇怪的是,如果从另一个C++控制台应用程序调用,同样的C++ + DLL工作得很好。但是当从.NET控制台应用程序调用时,它崩溃了 我尝试过的另一件事是增加堆栈内存限制(我在某处读

但是没有运气。应用程序崩溃,VS输出显示“访问冲突”错误。它发生在最后一行(
init();

然后在简单C++控制台应用程序中(在上面引用的同一页中找到): 我还创建了一个def文件,用于导出函数并将新的dll加载到我的C#project中。但当到达

cygwin\u dll\u init()
时,我再次遇到访问冲突崩溃。奇怪的是,如果从另一个C++控制台应用程序调用,同样的C++ + DLL工作得很好。但是当从.NET控制台应用程序调用时,它崩溃了

我尝试过的另一件事是增加堆栈内存限制(我在某处读到这可能是原因…),因此我创建了以下线程:

var thread = new Thread(Runner, int.MaxValue);// maxStackSize = int.MaxValue
thread.Start();
我已经将所有代码移动到线程执行的
Runner
方法中。这次应用程序没有崩溃,但是当到达
cygwin\u dll\u init()
时线程崩溃

有什么建议吗

谢谢

更新:我刚刚尝试使用C++/CLI包装器,但运气不好。相同的访问冲突错误再次出现


更新2:我刚刚发现,如果我使用32位版本的
cygwin1.dll
,并为x86体系结构编译我的C#项目,一切都会正常!但如果我使用64位版本的
cygwin1.dll
,并编译针对x64体系结构的C#项目,我会遇到访问冲突错误。我想到的第一件事是,文件系统重定向在某种程度上混淆了cygwin1.dll,但看起来情况并非如此(我尝试了
Wow64DisableWow64FsRedirection
)。一步一步,但仍然没有解决方案…< /P>代替编译CygWin环境的C++ DLL,考虑在MIW64环境中交叉编译。有一个cygwin包提供了mingw64交叉编译器。当运行(在cygwin中)时,它会创建不使用cygwin1.dll的dll。此类dll在Windows环境中工作得更好,因为它们不需要cygwin1.dll(因此您不必初始化它)。您可能仍然需要链接一些mingw64运行时dll(同样在交叉编译器包中提供,但也不需要cygwin1.dll)。感谢tryng的帮助!我没有交叉编译的经验,但我怀疑我能否避免cygwin1.dll依赖关系,因为我的程序需要使用一些存在于其中的函数(即
forkpty
)。如果我错了,请纠正我。谢谢
var thread = new Thread(Runner, int.MaxValue);// maxStackSize = int.MaxValue
thread.Start();