C++ CLR控制台应用报错C3374:无法获取Directory::GetCurrentDirectory地址
解决Error C3374: 无法获取'System::IO::Directory::GetCurrentDirectory'的地址,除非创建委托实例
嘿,这个C3374错误我熟!咱们先搞清楚问题出在哪,再一步步解决~
错误原因分析
你应该是在代码里尝试获取System::IO::Directory::GetCurrentDirectory这个静态方法的地址(比如写了&System::IO::Directory::GetCurrentDirectory),但在C++/CLI的规则里,托管静态方法的地址不能直接获取,除非你是要用来创建对应的委托实例。而你的需求是调用这个方法拿到当前目录,根本不需要取地址,这就是错误的根源啦。
正确实现代码
下面是满足你需求的完整代码:获取当前目录,然后遍历该目录及其所有子目录下的所有文件:
#include <iostream> #using <System.dll> using namespace System; using namespace System::IO; int main() { try { // 正确姿势:直接调用GetCurrentDirectory方法,不要取地址! String^ currentDirectory = Directory::GetCurrentDirectory(); Console::WriteLine("当前目录:" + currentDirectory); // 获取目录及所有子目录下的所有文件 // 参数说明:目录路径、匹配模式、搜索选项(包含子目录) array<String^>^ allFiles = Directory::GetFiles( currentDirectory, "*.*", SearchOption::AllDirectories ); Console::WriteLine("\n找到的所有文件:"); for each (String^ filePath in allFiles) { Console::WriteLine(filePath); } } catch (IOException^ ex) { Console::WriteLine("IO异常:" + ex->Message); } catch (UnauthorizedAccessException^ ex) { Console::WriteLine("权限不足:" + ex->Message); } catch (Exception^ ex) { Console::WriteLine("其他异常:" + ex->Message); } return 0; }
额外说明:什么时候可以取方法地址?
如果确实需要把这个静态方法包装成委托(比如用于异步回调等场景),可以这样写(不过你的场景不需要这个):
// 定义匹配方法签名的委托类型 using GetCurrentDirectoryDelegate = Func<String^>^; // 创建委托实例时,才允许取静态方法的地址 GetCurrentDirectoryDelegate dirDelegate = gcnew GetCurrentDirectoryDelegate(&Directory::GetCurrentDirectory); // 通过委托调用方法 String^ dir = dirDelegate();
内容的提问来源于stack exchange,提问作者Bequiny
相关产品推荐
相关产品推荐

