質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

141閲覧

c#のNDdeを使うコードで、アクセスビリティのエラーが解決しない。

sigefuji

総合スコア127

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2024/11/13 23:20

実現したいこと

Marketspeedからのリアルタイムデータを高精度で取得したく、下記のサイトのコードを試そうとしていますが、多数のエラーがあり、手に負えないのでMSのCopiloでアドバイス受けながら試行錯誤しながら進めていましたが、
どうしても、表題のエラーが解決しません。
参考サイト
C#でMarketSpeedからのリアルタイムデータを取得するプログラム
https://note.com/kornie701/n/n69771c26931d

発生している問題・エラーメッセージ

コンパイル時に エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<OnTickArgs>' のアクセシビリティはイベント 'RSS.OnTick' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 22 エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<DDEerrorArgs>' のアクセシビリティはイベント 'RSS.DDEerror' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 23

該当のソースコード

RSSCLient.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using NDde.Client; namespace RSSClient { public class Tick { public string RawPrice { get; set; } public string RawTime { get; set; } public string RawVolume { get; set; } } public class RSSClient { } } RSS.cs using NDde.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RSSClient { public class RSS { private string _Topic; private Tick tick = new Tick(); private DdeClient ddeClient; private List<Tick> _TimeAndSales = new List<Tick>(); public string Topic => _Topic; public List<Tick> TimeAndSales => _TimeAndSales; public DateTime SessionDate { get; set; } public event EventHandler<OnTickArgs> OnTick; // ****Error Line 22 public event EventHandler<DDEerrorArgs> DDEerror; // ****Error Line 23 public RSS(string topic) { _Topic = topic; } public void ReceiveData() { ResistTopic(); StartCallBack(); } void ResistTopic() { ddeClient = new DdeClient("RSS", _Topic); ddeClient.Advise += (s, e) => { if (e.Item == "現在値") { tick.RawPrice = e.Text; } else if (e.Item == "現在値詳細時刻") { tick.RawTime = e.Text; } else if (e.Item == "出来高") { tick.RawVolume = e.Text; var t = new Tick { RawPrice = tick.RawPrice, RawTime = tick.RawTime, RawVolume = tick.RawVolume }; _TimeAndSales.Add(t); //OnTick?.Invoke(this, new OnTickArgs(t)); // イベント発火 } }; ddeClient.Disconnected += (s, e) => Console.WriteLine(this._Topic + " is disconnected"); } public void StartCallBack() { var timeout = 5000; try { ddeClient.Context.Encoding = Encoding.Default; ddeClient.Connect(); while (!ddeClient.IsConnected) Thread.Sleep(100); tick.RawPrice = ddeClient.Request("現在値", timeout); tick.RawVolume = ddeClient.Request("出来高", timeout); //DDEerror?.Invoke(this, new DDEerrorArgs(_Topic + " : " + tick.RawPrice + " : " + tick.RawVolume)); // イベント発火 Thread.Sleep(500); ddeClient.StartAdvise("現在値", 1, true, false, timeout, this); ddeClient.StartAdvise("現在値詳細時刻", 1, true, false, timeout, this); ddeClient.StartAdvise("出来高", 1, true, false, timeout, this); } catch { string message = _Topic + " の登録に失敗しました。"; Console.WriteLine(message); //DDEerror?.Invoke(this, new DDEerrorArgs(message)); // イベント発火 } } public void StopAdvise() { var timeout = 5000; try { ddeClient.StopAdvise("出来高", timeout); ddeClient.StopAdvise("現在値詳細時刻", timeout); ddeClient.StopAdvise("現在値", timeout); } catch { //DDEerror?.Invoke(this, new DDEerrorArgs(_Topic.ToString())); } if (ddeClient.IsConnected) ddeClient.Disconnect(); ddeClient.Dispose(); ddeClient = null; } public void ExportTimeAndSales(string file) { if (_TimeAndSales.Count == 0) return; try { using (var sw = new System.IO.StreamWriter(file, false)) _TimeAndSales.ForEach(tick => sw.WriteLine("{0},{1},{2}", tick.RawTime, tick.RawPrice, tick.RawVolume)); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } } public void ClearTimeAndSales() => _TimeAndSales.Clear(); } } DDEerrorArgs.cs using System namespace RSSClient { internal class DDEerrorArgs : EventArgs { public string ErrorMessage { get; } public DDEerrorArgs(string errorMessage) { ErrorMessage = errorMessage; } } } OnTickaArgs.cs using System namespace RSSClient { internal class OnTickArgs : EventArgs { public Tick TickData { get; } public OnTickArgs(Tick tick) { TickData = tick; } } } Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace RSSClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } } }

試したこと

Copilotのアドバイスで、元のサイトのコードから、名前空間関係のエラーを区別すべく、クラスを追加したり、受信データの成形に関するTrytoDoubleなどの機能部分を、生のデータを出力するなどの修正追加を少なからず行っています。
Copilotと3日間にわたり述べ10時間くらいやっていましたが、このエラーが解決せず。こちらにお尋ねすることにしました。しかし、Copilotは大したものですね。全コードを提示すると、いろんなアプローチを次から次へと提案して、それらを試しながら行ったのです。しかし、原コードは動いていると思うので、きっと簡単な何かに問題があるだろうと思っています。
それから、原コードの機能で、MarketSpeedからのリアルタイムデータが原コードのNDdeで取得できる仕組みが理解できません。ローカルサーバアドレスなども指定していないのにです。よろしければ、これもご説明願えると嬉しいです。

補足情報(FW/ツールのバージョンなど)

Visualc++2022無料版 windows10 64bit 

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juner

2024/11/14 00:00 編集

それぞれ の イベント のアクセシビリティが public で 型が internal なのは把握できていますでしょうか? (※ EventHandler<T> の T にあたる型が internal 直すなら 両方 internal にするか、 両方 public にするべきではないでしょうか?
sigefuji

2024/11/14 00:55

コメントありがとうございます。修正すればOkでした。アクセスビリティ修飾子の説明サイトでおおよそわかりましたが、あとでじっくり検討します。また、この知識をもとに原コードを再度試して見たところ、OKでした。Copilotのアドバイスは何だったのだろう。知識のない状態でcopilotの提案を受け入れたのがダメのようでした。勉強になりありがとうございました。
dodox86

2024/11/14 01:27

既に解決した質問であり、横からですみませんが: @質問者 sigefujiさん > Copilotのアドバイスは何だったのだろう。知識のない状態でcopilotの提案を受け入れたのがダメのようでした。 この質問に限らないのですが、最近、ChatGPTやCopilotの提案ほぼそのままのコードを使われての質問が多いです。しかしながらそれらを読んでみると、提案されたコードの内容を理解せずに使っていての発生する問題が多いです。内容を咀嚼して使わないとダメです。 Copilotは私もよく使っていますが、提案されたコードが間違っていて、それをCopilotに指摘すると謝罪と共に直したり代案を提示してくることもよくあります。 また、求めるものと違う回答を得た場合は与えるプロンプト(質問)自体が不適切なことがあり、それを考えても回答内容を理解した上で使うことが大事です。 > 原コードの機能で、MarketSpeedからのリアルタイムデータが原コードのNDdeで取得できる仕組みが理解できません。ローカルサーバアドレスなども指定していないのにです。よろしければ、これもご説明願えると嬉しいです。 これについては、NDdeのプログラム自身がDDEを使って楽天RSSと通信していて、 > ddeClient = new DdeClient("RSS", _Topic); での引数"RSS"で「楽天RSS」を指すようです。 自分でDDEサーバーを建てることも可能なようで、個人的には技術的に興味深いプロダクトですね。
guest

回答1

0

ベストアンサー

それはエラーの通りではないでしょうか?

エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<OnTickArgs>' のアクセシビリティはイベント 'RSS.OnTick' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 22 エラー (アクティブ) CS7025 アクセシビリティに一貫性がありません。 イベント型 'EventHandler<DDEerrorArgs>' のアクセシビリティはイベント 'RSS.DDEerror' よりも低く設定されています RSSClient C:\kabusapi\RSSClient3\RSSClient\RSS.cs 23

見ての通り、このイベントのアクセシビリティは public です。

cs

1public event EventHandler<OnTickArgs> OnTick; // ****Error Line 22 2public event EventHandler<DDEerrorArgs> DDEerror; // ****Error Line 23

ただ、 EventHandler<T> に渡している型の定義はどうなっていますでしょうか?

cs

1internal class OnTickArgs : EventArgs 2{ 3 public Tick TickData { get; } 4 5 public OnTickArgs(Tick tick) 6 { 7 TickData = tick; 8 } 9}

cs

1internal class DDEerrorArgs : EventArgs 2{ 3 public string ErrorMessage { get; } 4 5 public DDEerrorArgs(string errorMessage) 6 { 7 ErrorMessage = errorMessage; 8 } 9}

ともに internal です。

対応方法

片方に合わせた型にしてください 両方 public にするか それとも 両方 internal にするか。

以上。

参考資料

投稿2024/11/14 00:09

編集2024/11/14 00:11
juner

総合スコア453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigefuji

2024/11/14 00:57

解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問