我一直在尝试通过我的ASP.NET网站通过P / Invoke编写和读取文件。通过网站中的dlls
执行此操作时,我遇到了写入/读取文件的位置问题。我试图用下面的例子来解释这个问题:
.cpp文件(包含读写功能)
extern "C" TEST_API int fnTest(char* fileDir)
{
ofstream myfile;
myfile.open (strcat(fileDir, "test.txt"));
myfile << "Writing this to a file.\n";
myfile.close();
}
extern "C" TEST_API char* fnTest1(char* fileDir)
{
ifstream myReadFile;
myReadFile.open(strcat(fileDir, "test1.txt"));
char output[100];
if (myReadFile.is_open()) {
while (!myReadFile.eof()) {
myReadFile >> output;
return output;
}
网站的构建后事件,将上面的C ++项目中的dll复制到网站的bin
文件夹
Default.aspx.cs - C#
Dll功能
public static class Functions(){
DllImport[("Test1.dll", EntryPoint="fnTest", CharSet=CharSet.Ansi]
public static extern int fnTest(string dir);
DllImport[("Test1.dll", EntryPoint="fnTest1", CharSet=CharSet.Ansi]
public static extern StringBuilder fnTest1(string dir);
}
Page_Load事件
string direc = AppDomain.CurrentDomain.BaseDirectory + "bin\\";
string txt1 = Functions.fnTest(direc).ToString(); //failing here - keeps on loading the page forever
string txt2 = Functions.fnTest(direc).ToString(); //failing here - keeps on loading the page forever
如果我在桌面应用程序中尝试相同的Page_Load代码并将direc
设置为项目输出的当前目录,那么一切正常。只有在网站的情况下,要写入或读取文件的目录才是混乱的,我真的无法弄清楚如何纠正这个并使其正常工作。建议将不胜感激。
答案 0 :(得分:0)
您仍然遇到许多与last question相同的问题。
这一次你最大的问题就在这里:
strcat(fileDir, "test.txt")
您无法修改fileDir
,因为它归pinvoke marshaller所有。不是将目录传递给本机代码,而是将完整路径传递给文件。在托管代码中使用Path.Combine
来创建它,并将其传递给本机代码。
extern "C" TEST_API int fnTest(char* filename)
{
ofstream myfile;
myfile.open(filename);
myfile << "Writing this to a file.\n";
myfile.close();
}
和托管代码
string filename = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory, "bin", "test.txt");
string txt1 = Functions.fnTest(filename).ToString();
在注释中,您解释了需要在本机代码中连接字符串。您需要创建一个本机字符串才能执行此操作,因为您不能写入fileDir
。像这样:
string fileName = string(fileDir) + "test.txt";
myfile.open(fileName.c_str());
但您仍然需要修复读取文件的fnTest1
。我在你的另一个问题的回答告诉你如何做到这一点。