2014-12-17 30 views
5

Tôi có một C# DLL và một Visual Basic 6 DLL.C# Số thập phân cho VB6 Tiền tệ

Trong C# có trường x có loại dữ liệu Thập phân. Trong VB6 có một trường y với kiểu dữ liệu Đơn vị tiền tệ.

Cách tốt nhất để chuyển x thành y và quay lại là gì?

Hiện tại tôi chuyển đổi các trường thành Đúp, nhưng tôi không chắc chắn nếu có ý nghĩa làm tròn.

Cập nhật 1:

Dựa trên những lời khuyên hữu ích này là những gì mã của tôi trông bây giờ:

public void FromVbToNet(long vb6curr) 
    { 
     decimal value = vb6curr/10000; 
    } 

Vấn đề là, khi tôi cố gắng gọi này từ VB6 qua interop, tôi nhận được một biên dịch lỗi:

"Chức năng hoặc giao diện được đánh dấu là bị hạn chế hoặc chức năng sử dụng loại Tự động hóa không được hỗ trợ trong Visual Basic"

Vậy làm cách nào để khai báo vb6curr? Chuỗi, Đối tượng, Động?

Cập nhật 2:

Trong trường hợp bất cứ ai cần này để tham khảo, sau khi đọc thêm tôi đã đưa ra các giải pháp sau đây:

[return: MarshalAs(UnmanagedType.Currency)] 
public decimal GetDecimalFromNetDll() 
{ 
    decimal value = ... // Read from database 
    return value; 
} 

public void SetDecimalInNetDll([MarshalAs(UnmanagedType.Currency)] decimal value) 
{ 
    // Save to database 
} 

tôi gọi đó là các từ mã không được quản lý của tôi trong VB6 với một Đơn vị tiền tệ và mọi thứ dường như hoạt động cho đến thời điểm này.

Trả lời

7

Sau khi một số đọc Tôi đã đưa ra giải pháp này (xem thêm bên dưới Cập nhật 2).

Tôi phải so sánh số Decimal nhập.Net đến Đơn vị tiền tệ nhập mã VB6 không được quản lý và ngược lại.

[return: MarshalAs(UnmanagedType.Currency)] 
public decimal GetDecimalFromNetDll() 
{ 
    decimal value = ... // Read from database 
    return value; 
} 

public void SetDecimalInNetDll([MarshalAs(UnmanagedType.Currency)] decimal value) 
{ 
    // Save to database 
} 

Để biết thông tin chi tiết xem: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute%28v=vs.110%29.aspx

9

VB6 Currency loại dữ liệu được lưu trữ dưới dạng số nguyên 64 bit, được thu nhỏ hoàn toàn theo 10,000. Được trang bị kiến ​​thức đó rất đơn giản để chuyển đổi giữa loại đó và .net Decimal.

Ở phía VB6, bạn chuyển dữ liệu dưới dạng Currency. Trên mặt C# bạn vượt qua nó như long. Sau đó, bên C#, bạn mở rộng quy mô 10,000 để chuyển đổi giữa giá trị decimal và giá trị long của bạn.

Ví dụ khi bạn có một VB6 giá trị Currency tổ chức tại một C# lâu bạn chuyển đổi sang decimal như thế này:

long vb6curr = ...; 
decimal value = vb6curr/10000; 

Trong một hướng khác nó sẽ là:

decimal value = ...; 
long vb6curr = Convert.ToInt64(value*10000); 
+0

Xin lỗi Tôi thực sự lúng túng ở đây. Tôi đã thử một biến dài (int64), nhưng điều đó không được hỗ trợ bởi VB6. Giải pháp duy nhất tôi thấy là làm tròn số thập phân đến gấp đôi, vì double là kiểu 64 bit duy nhất mà VB6 biết. Tôi có đúng không? –

+1

Ở phía VB6, sử dụng 'Tiền tệ'. Ở phía C#, sử dụng 'long'. Quy mô giá trị bằng '10.000' trong mã C# khi chuyển đổi giữa' thập phân' và 'dài'. –

Các vấn đề liên quan