Memiliki rakitan yang tidak dapat saya modifikasi (disediakan vendor) yang memiliki metode yang mengembalikan tipe objek tetapi sebenarnya merupakan tipe internal.
Bagaimana cara mengakses bidang dan / atau metode objek dari perakitan saya?
Perlu diingat bahwa saya tidak dapat mengubah rakitan yang disediakan vendor.
Intinya, inilah yang saya miliki:
Dari vendor:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
Dari perakitan saya menggunakan perakitan vendor.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
tetapi tidak menyertakan rakitan Anda? Jika simbol tidak benar-benar tersembunyi, itu adalah bagian dari ABI.Saya hanya melihat satu kasus di mana Anda mengizinkan pemaparan anggota internal Anda ke majelis lain dan itu untuk tujuan pengujian.
Mengatakan bahwa ada cara untuk mengizinkan rakitan "Teman" mengakses internal:
Dalam file AssemblyInfo.cs proyek Anda menambahkan baris untuk setiap perakitan.
info ini tersedia di sini.
Semoga ini membantu.
sumber
Saya ingin membantah satu hal - bahwa Anda tidak dapat menambah rakitan asli - menggunakan Mono.Cecil, Anda dapat menyuntikkan
[InternalsVisibleTo(...)]
ke rakitan 3pty. Perhatikan mungkin ada implikasi hukum - Anda mengotak-atik perakitan 3pty dan implikasi teknis - jika rakitan memiliki nama yang kuat, Anda perlu menghapusnya atau menandatanganinya kembali dengan kunci yang berbeda.Dan kodenya seperti:
sumber
Refleksi.
Gunakan kekuatan dengan bijak. Jangan lupa pengecekan error. :)
sumber
Ya, Anda tidak bisa. Kelas internal tidak dapat terlihat di luar rakitan mereka, jadi tidak ada cara eksplisit untuk mengaksesnya secara langsung -AFAIK tentunya. Satu-satunya cara adalah dengan menggunakan runtime late-binding melalui refleksi, lalu Anda bisa memanggil metode dan properti dari kelas internal secara tidak langsung.
sumber