0

ASP.NETWebサイトを介してP/Invokeを介してファイルの書き込みと読み取りを試みています。Webサイトでこれを行うときに、ファイルがどこに書き込まれるか、または読み取られるかという問題に直面しています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;
}

Webサイトのビルドイベントを投稿して、上記のC++プロジェクトからWebサイトのbinフォルダーにdllをコピーします。

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

direcプロジェクト出力の現在のディレクトリとして設定されているデスクトップアプリケーションで同じPage_Loadコードを試してみると、すべてが正常に機能します。Webサイトの場合、ファイルの書き込みまたは読み取りが行われるディレクトリが混乱しているだけであり、これを修正して機能させる方法を実際に理解することはできません。提案をいただければ幸いです。

4

1 に答える 1

0

最後の質問と同じ問題がまだたくさんあります。

今回の最大の問題はここにあります:

strcat(fileDir, "test.txt")

fileDirpinvokeマーシャラーが所有しているため、変更できません。ディレクトリをネイティブコードに渡す代わりに、ファイルへのフルパスを渡します。マネージコードで使用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ただし、どちらがファイルを読み取るかを修正する必要があります。あなたの他の質問での私の答えはあなたにそれをする方法を教えてくれます。

于 2012-04-27T16:19:32.233 に答える